mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-22 20:43:02 +01:00
897ac0c650
* Add FORMAT clause to convert datetime types to string and vice versa * Add tests for FORMAT clause * Fixes after review * Change TZD to TZR * Change inline variables back to static * Add README documentation * Add ability to use " in raw string and ... Use session timezone if timezone is not specified. Add ability to use + sign in timezone offset. Add truncating string exception. * Move util methods from BOOST_AUTO_TEST_SUITE * Switch back to inline variables * Consider charset in the format string * Add ability to write patterns without separators * Use printf to add extra zeros Also add extra zeros to the year patterns. * Replace template exception with a plain function * Clean code after review * Fix bug with TZH:TZM when TZH is 0 * Add TZR to STRING to DATE --------- Co-authored-by: Artyom Ivanov <artyom.ivanov@red-soft.ru>
96 lines
3.2 KiB
Markdown
96 lines
3.2 KiB
Markdown
## 1. DATETIME TO STRING
|
|
|
|
The following flags are currently implemented for datetime to string conversion:
|
|
| Format Pattern | Description |
|
|
| -------------- | ----------- |
|
|
| YEAR | Year (1 - 9999) |
|
|
| YYYY | Last 4 digits of Year (0001 - 9999) |
|
|
| YYY | Last 3 digits of Year (000 - 999) |
|
|
| YY | Last 2 digits of Year (00 - 99) |
|
|
| Y | Last 1 digits of Year (0 - 9) |
|
|
| Q | Quarter of the Year (1 - 4) |
|
|
| MM | Month (01 - 12) |
|
|
| MON | Short Month name (Apr) |
|
|
| MONTH | Full Month name (APRIL) |
|
|
| RM | Roman representation of the Month (I - XII) |
|
|
| WW | Week of the Year (01 - 53) |
|
|
| W | Week of the Month (1 - 5) |
|
|
| D | Day of the Week (1 - 7) |
|
|
| DAY | Full name of the Day (MONDAY) |
|
|
| DD | Day of the Month (01 - 31) |
|
|
| DDD | Day of the Year (001 - 366) |
|
|
| DY | Short name of the Day (Mon) |
|
|
| J | Julian Day (number of days since January 1, 4712 BC) |
|
|
| HH / HH12 | Hour of the Day (01 - 12) with period (AM, PM) |
|
|
| HH24 | Hour of the Day (00 - 23) |
|
|
| MI | Minutes (00 - 59) |
|
|
| SS | Seconds (00 - 59) |
|
|
| SSSSS | Seconds after midnight (0 - 86399) |
|
|
| FF1 - FF9 | Fractional seconds with the specified accuracy |
|
|
| TZH | Time zone in Hours (-14 - 14) |
|
|
| TZM | Time zone in Minutes (00 - 59) |
|
|
| TZR | Time zone Name |
|
|
|
|
The dividers are:
|
|
| Dividers |
|
|
| ------------- |
|
|
| . |
|
|
| / |
|
|
| , |
|
|
| ; |
|
|
| : |
|
|
| 'space' |
|
|
| - |
|
|
|
|
Patterns can be used without any dividers:
|
|
```
|
|
SELECT CAST(CURRENT_TIMESTAMP AS VARCHAR(50) FORMAT 'YEARMMDD HH24MISS') FROM RDB$DATABASE;
|
|
=========================
|
|
20230719 161757
|
|
```
|
|
However, be careful with patterns like `DDDDD`, it will be interpreted as `DDD` + `DD`.
|
|
|
|
It is possible to insert raw text into a format string with `""`: `... FORMAT '"Today is" DAY'` - Today is MONDAY. To add `"` in output raw string use `\"` (to print `\` use `\\`).
|
|
Also the format is case-insensitive, so `YYYY-MM` == `yyyy-mm`.
|
|
Example:
|
|
```
|
|
SELECT CAST(CURRENT_TIMESTAMP AS VARCHAR(45) FORMAT 'DD.MM.YEAR HH24:MI:SS "is" J "Julian day"') FROM RDB$DATABASE;
|
|
=========================
|
|
14.6.2023 15:41:29 is 2460110 Julian day
|
|
```
|
|
|
|
## 2. STRING TO DATETIME
|
|
|
|
The following flags are currently implemented for string to datetime conversion:
|
|
| Format Pattern | Description |
|
|
| ------------- | ------------- |
|
|
| YEAR | Year |
|
|
| YYYY | Last 4 digits of Year |
|
|
| YYY | Last 3 digits of Year |
|
|
| YY | Last 2 digits of Year |
|
|
| Y | Last 1 digits of Year |
|
|
| MM | Month (1 - 12) |
|
|
| MON | Short Month name (Apr) |
|
|
| MONTH | Full Month name (APRIL) |
|
|
| RM | Roman representation of the Month (I - XII) |
|
|
| DD | Day of the Month (1 - 31) |
|
|
| J | Julian Day (number of days since January 1, 4712 BC) |
|
|
| HH / HH12 | Hour of the Day (1 - 12) with period (AM, PM) |
|
|
| HH24 | Hour of the Day (0 - 23) |
|
|
| MI | Minutes (0 - 59) |
|
|
| SS | Seconds (0 - 59) |
|
|
| SSSSS | Seconds after midnight (0 - 86399) |
|
|
| FF1 - FF4 | Fractional seconds with the specified accuracy |
|
|
| TZH | Time zone in Hours (-14 - 14) |
|
|
| TZM | Time zone in Minutes (0 - 59) |
|
|
| TZR | Time zone Name |
|
|
|
|
Dividers are the same as for datetime to string conversion and can also be omitted.
|
|
|
|
Example:
|
|
```
|
|
SELECT CAST('2000.12.08 12:35:30.5000' AS TIMESTAMP FORMAT 'YEAR.MM.DD HH24:MI:SS.FF4') FROM RDB$DATABASE;
|
|
=====================
|
|
2000-12-08 12:35:30.5000
|
|
```
|