Summary: in this tutorial, you will learn about the Oracle date format and various format elements for formatting date data.
Introduction to Oracle Date Format Model #
Oracle Database uses an internal format for storing DATE
data. Therefore, before inserting date data in a non-standard format into the database, you need to use the TO_DATE()
function to convert it to Oracle’s internal date format.
Similarly, after querying the date data from the database, you need to use the TO_CHAR()
function to format it to make the date data human-readable.
Both TO_DATE()
and TO_CHAR()
functions use a date format model describing the format of the date data stored in a character string.
Suppose you have a literal string that represents a date as follows:
'31-Dec-1999'
Code language: SQL (Structured Query Language) (sql)
The date format model for this string is:
'DD-Mon-YYYY'
Code language: SQL (Structured Query Language) (sql)
A date format model is composed of one or more date format elements. In this example, the format elements are: DD
represents the day, Mon
represents the abbreviated name of the month, YYYY
represents the 4-digit year, and the character string literal '-'
represents the hyphen character.
Date Format Elements #
If you use a date format element in a specific case, e.g., uppercase, lowercase, etc., the output will be in the corresponding case.
For example, the date format element 'DAY'
returns uppercase words like TUESDAY
; 'Day'
returns 'Tuesday'
; and 'day'
returns 'tuesday'
.
The following table shows the date format elements. The example is based on the date value 01-AUG-2017 15:30:20
Element | Description | Example (*) |
---|---|---|
AD, A.D. | AD indicator with or without periods. | AD or A.D. |
AM, A.M. | Meridian indicator with or without periods. | AM or A.M. |
BC, B.C. | BC indicator with or without periods. | BC or B.C. |
CC, SCC | Two-digit century. If the last 2 digits of a y-digit year are 00, the century is the same as the first 2 digits e.g., 2000 returns 20. In case the last 2 digits are between 01 and 99 (inclusive), then the century is one greater than the first 2 digits of that year e.g., 2001 returns 21. | 2000 returns 20; 2001 returns 21; |
D | Day of week (1-7), where 1 is Sunday (depends on NLS_TERRITORY) | 1 |
DAY | Name of a day that is controlled by the value of the NLS_DATE_LANGUAGE parameter | MONDAY |
DD | Day of month (1-31) | 15 |
DDD | Day of year (1-366) | 100 |
DL | Long date format based on NLS_DATE_FORMAT . Only with the TS element, separated by white space. | Tuesday, August 01, 2017 |
DS | Short date format based on NLS_TERRITORY and NLS_LANGUAGE parameters. Only used with the TS element, separated by white space. | 8/1/2017 |
DY | Abbreviated name of the day. | TUE |
E | Abbreviated era name e.g., Japanese Imperial, ROC Official, etc. | 和 (Japanese era) |
EE | Full era name e.g., Japanese Imperial, ROC Official, etc.. | 平成 (Heisei) |
FF [1..9] | Fractional seconds
| .123456789 |
FM | Returns a value with no leading or trailing blanks. | |
FX | Requires exact matching between the character data and the format model. | |
HH, HH12 | Hour of day (1-12). | 03 |
HH24 | Hour of day (0-23). | 15 |
IW | Week of the year (1-52 or 1-53) based on the ISO standard. | 31 |
I, IY, IYY | Last 1, 2, or 3 digits of ISO year. | I → 7, IY → 17, IYY → 017 |
IYYY | 4-digit year based on the ISO standard. | 2017 |
J | Julian day, which is the number of days since January 1, 4712 BC. | 2457967 |
MI | Minute (0-59) | 30 |
MM | Month (01–12; Jan = 01) | 08 |
MON | Abbreviated month name | AUG |
MONTH | Full month name, padded with blanks | AUGUST |
PM, P.M. | Meridian indicator for PM with or without periods | |
Q | Quarter of year (1–4) | 3 |
RM | Roman numeral month (I-XII; January = I). | VIII |
RR | 2-digit year with century inference for 1950–2049 | 99 → 1999, 01 → 2001 |
RRRR | 4-digit year like YYYY (not time zone-related) | 2017 |
SS | Seconds (0–59) | 20 |
SSSSS | Seconds since midnight (0–86399) | 55820 |
TS | Tim in the short time format, depending on the NLS_TERRITORY and NLS_LANGUAGE parameters. Only use with the DL or DS element, separated by white space. | 3:30:00 PM |
TZD | PST (for US/Pacific Standard Time); PDT (for US/Pacific daylight time) | PST, PDT |
TZH | Time zone hour (used in timestamps) | +02 |
TZM | Time zone minute (used in timestamps) | 00 |
TZR | Time zone region name | US/Pacific |
WW | Week of year (1–53), starting from Jan 1 | 31 |
W | Week of month (1–5); first week starts on 1st of the month | 2 |
Y,YYY | 4-digit year with a comma | 2,017 |
YEAR SYEAR | Year, spelled out; S prefixes BC dates with a minus sign (-). | TWENTY SEVENTEEN |
YYYY, SYYYY | 4-digit year; SYYYY includes minus for BC | 2017 or -0044 |
Y, YY, YYYY | Last 1, 2, or 3 digits of the year | 7, 17, 017 |
Besides the standard date format elements, you can include the following characters in the date format model.
- Punctuation such as hyphen (-), slash (/), comma (,), period (.) and colons (:)
- Character string literals are enclosed in double quotation marks.
These punctuation and characters appear in the return value in the exact location as in the format model.
It is not valid to use the same format element twice or combine format elements that represent similar information for input date models. For example, you cannot use ‘SYYYY’ and ‘BC’ in the same date format model.
AD #
SELECT
TO_CHAR (
TO_DATE ('2017-08-01 15:30:20', 'YYYY-MM-DD HH24:MI:SS'),
'AD'
) RESULT;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
AD
Code language: SQL (Structured Query Language) (sql)
AM #
SELECT
TO_CHAR (
TO_DATE ('2017-08-01 15:30:20', 'YYYY-MM-DD HH24:MI:SS'),
'AM'
) RESULT;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
PM
Code language: SQL (Structured Query Language) (sql)
BC #
SELECT
TO_CHAR (
TO_DATE ('2017-08-01 15:30:20', 'YYYY-MM-DD HH24:MI:SS'),
'BC'
) RESULT;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
AD
Code language: SQL (Structured Query Language) (sql)
CC #
SELECT
TO_CHAR (
TO_DATE ('2017-08-01 15:30:20', 'YYYY-MM-DD HH24:MI:SS'),
'CC'
) RESULT;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
21
Code language: SQL (Structured Query Language) (sql)
D – Day of the week #
SELECT
TO_CHAR (
TO_DATE ('2017-08-01 15:30:20', 'YYYY-MM-DD HH24:MI:SS'),
'D'
) RESULT;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
3
Code language: SQL (Structured Query Language) (sql)
DAY – Day Name #
SELECT
TO_CHAR (
TO_DATE ('2017-08-01 15:30:20', 'YYYY-MM-DD HH24:MI:SS'),
'DAY'
) RESULT;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
---------
TUESDAY
Code language: SQL (Structured Query Language) (sql)
DD – Day of the month (1–31) #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'DD') RESULT
FROM
dual;
Code language: JavaScript (javascript)
Output:
RESULT
------
01
DDD – Day of the year (1–366) #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'DDD') RESULT
FROM
dual;
Code language: JavaScript (javascript)
Output:
RESULT
------
213
August 1 is the 213th day of the year in a non-leap year (2017).
DL – Long date format (NLS-dependent) #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'DL') RESULT
FROM
dual;
Code language: JavaScript (javascript)
Sample Output (may vary by NLS settings).
DS – Short date format (NLS-dependent) #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'DS') RESULT
FROM
dual;
Code language: JavaScript (javascript)
Sample Output (may vary by NLS settings):
DY – Abbreviated name of the day #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'DY') RESULT
FROM
dual;
Code language: JavaScript (javascript)
Output:
RESULT
------
TUE
D – Day of the week (1–7, NLS-dependent: 1 = Sunday by default) #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'D') RESULT
FROM
dual;
Code language: JavaScript (javascript)
Output:
RESULT
------
3
2017-08-01 is a Tuesday, and in most US-based NLS settings, Sunday = 1, so Tuesday = 3.
E – Abbreviated era name #
Only works for certain NLS calendars like Japanese Imperial, ROC, etc.
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'E') RESULT
FROM
dual;
Code language: JavaScript (javascript)
EE – Full Era Name #
Only works for certain NLS calendars like Japanese Imperial, ROC, etc.
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'EE') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
FF1 – 1 digit of fractional seconds #
SELECT
TO_CHAR (
TO_TIMESTAMP (
'2017-08-01 15:30:20.123456',
'YYYY-MM-DD HH24:MI:SS.FF'
),
'FF1'
) RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
1
Code language: SQL (Structured Query Language) (sql)
FM – No padding #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'FMDay') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
-------
Tuesday
Code language: SQL (Structured Query Language) (sql)
FX – Exact match (used with TO_DATE) #
SELECT
TO_DATE ('2017-08-01 15:30:20', 'FXYYYY-MM-DD HH24:MI:SS') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
-------------------
01-AUG-17 03.30.20 PM
Code language: SQL (Structured Query Language) (sql)
HH / HH12 – Hour (1–12) #
SELECT
TO_CHAR (
TO_DATE ('2017-08-01 03:30:20', 'YYYY-MM-DD HH24:MI:SS'),
'HH'
) RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
03
Code language: SQL (Structured Query Language) (sql)
HH24 – Hour (0–23) #
SELECT
TO_CHAR (
TO_DATE ('2017-08-01 15:30:20', 'YYYY-MM-DD HH24:MI:SS'),
'HH24'
) RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
15
Code language: SQL (Structured Query Language) (sql)
IW – ISO week number #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'IW') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
31
Code language: SQL (Structured Query Language) (sql)
I, IY, IYY, IYYY – ISO year parts #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'I') RESULT
FROM
dual;
-- Output: 7
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'IY') RESULT
FROM
dual;
-- Output: 17
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'IYY') RESULT
FROM
dual;
-- Output: 017
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'IYYY') RESULT
FROM
dual;
-- Output: 2017
Code language: SQL (Structured Query Language) (sql)
J – Julian Day #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'J') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
--------
2457967
Code language: SQL (Structured Query Language) (sql)
MI – Minutes #
SELECT
TO_CHAR (
TO_DATE ('2017-08-01 15:30:20', 'YYYY-MM-DD HH24:MI:SS'),
'MI'
) RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
30
Code language: SQL (Structured Query Language) (sql)
MM – Month number #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'MM') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
08
Code language: SQL (Structured Query Language) (sql)
MON – Abbreviated month #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'MON') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
AUG
Code language: SQL (Structured Query Language) (sql)
MONTH – Full month name #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'MONTH') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
----------
AUGUST
Code language: SQL (Structured Query Language) (sql)
PM / P.M. – Meridian indicator (uppercase) #
SELECT
TO_CHAR (
TO_DATE ('2017-08-01 15:30:20', 'YYYY-MM-DD HH24:MI:SS'),
'PM'
) RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
PM
Code language: SQL (Structured Query Language) (sql)
Q – Quarter of the year #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'Q') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
3
Code language: SQL (Structured Query Language) (sql)
RM – Roman numeral month #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'RM') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
VIII
Code language: SQL (Structured Query Language) (sql)
RR – Two-digit year, special century handling #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'RR') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
17
Code language: SQL (Structured Query Language) (sql)
RRRR – Treated the same as YYYY (4-digit year) #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'RRRR') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
2017
Code language: SQL (Structured Query Language) (sql)
SS – Seconds (0–59) #
SELECT
TO_CHAR (
TO_DATE ('2017-08-01 15:30:20', 'YYYY-MM-DD HH24:MI:SS'),
'SS'
) RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
20
Code language: SQL (Structured Query Language) (sql)
SSSSS – Seconds past midnight #
SELECT
TO_CHAR (
TO_DATE ('2017-08-01 15:30:20', 'YYYY-MM-DD HH24:MI:SS'),
'SSSSS'
) RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
-------
55820
Code language: SQL (Structured Query Language) (sql)
TS – Short time format (based on NLS) #
SELECT
TO_CHAR (
TO_DATE ('2017-08-01 15:30:20', 'YYYY-MM-DD HH24:MI:SS'),
'TS'
) RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output (NLS-dependent, example below):
RESULT
----------
3:30:20 PM
Code language: SQL (Structured Query Language) (sql)
WW – Week number of year (starts from Jan 1) #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'W') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
31
Code language: SQL (Structured Query Language) (sql)
W – Week number of month (starts from 1st) #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'W') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
1
Code language: SQL (Structured Query Language) (sql)
Y, YY, YYY – Last 1, 2, or 3 digits of year #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'Y') RESULT
FROM
dual;
-- Output: 7
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'YY') RESULT
FROM
dual;
-- Output: 17
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'YYY') RESULT
FROM
dual;
-- Output: 017
Code language: SQL (Structured Query Language) (sql)
YYYY / SYYYY – 4-digit year (S adds minus for BC) #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'YYYY') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------
2017
Code language: SQL (Structured Query Language) (sql)
YEAR / SYEAR – Year spelled out #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'YEAR') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
------------
TWENTY SEVENTEEN
Code language: SQL (Structured Query Language) (sql)
Y,YYY – 4-digit year with comma #
SELECT
TO_CHAR (TO_DATE ('2017-08-01', 'YYYY-MM-DD'), 'Y,YYY') RESULT
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
Output:
RESULT
-------
2,017
Code language: SQL (Structured Query Language) (sql)
Summary #
- Use the Oracle Date Format to format date data for storing and displaying.