Date |
Current Date | CURRENT_DATE SYSDATE |
SELECT TO_CHAR(CURRENT_DATE , 'DD-MON-YYYY HH:MI:SS') FROM dual; SELECT TO_CHAR(SYSDATE , 'DD-MON-YYYY HH:MI:SS') FROM dual; |
Formats |
Day | Month | Year | Fill Mode | Julian Date | D | MM | YY | FM | J | DD | MON | YYYY | | | DDTH | | RR | | | DAY | | RRRR | | |
|
|
+ AND - |
+ | <date> + <integer> |
SELECT SYSDATE + 1 FROM dual; |
- | <date> - <integer> |
SELECT SYSDATE - 1 FROM dual; |
|
ADD_MONTHS |
Add A Month To A Date | ADD_MONTHS(<date>, <number of months_integer> |
SELECT add_months (SYSDATE, 2) FROM dual; -- but be aware of what it is doing SELECT add_months (TO_DATE('27-JAN-2007'), 1) FROM dual; SELECT add_months (TO_DATE('28-JAN-2007'), 1) FROM dual; SELECT add_months (TO_DATE('29-JAN-2007'), 1) FROM dual; SELECT add_months (TO_DATE('30-JAN-2007'), 1) FROM dual; SELECT add_months (TO_DATE('31-JAN-2007'), 1) FROM dual; SELECT add_months (TO_DATE('01-FEB-2007'), 1) FROM dual; |
|
CURRENT_DATE |
Returns the current date of the server as a value in the Gregorian calendar of datatype DATE | |
col sessiontimezone format a30 SELECT sessiontimezone, current_date FROM dual; ALTER SESSION SET TIME_ZONE = '-5:0'; SELECT sessiontimezone, current_date FROM dual; ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; SELECT sessiontimezone, current_date FROM dual; ALTER SESSION SET TIME_ZONE = '-7:0'; SELECT sessiontimezone, current_date FROM dual; ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY'; |
|
DUMP |
Returns The Number Of Bytes And Datatype Of A Value | DUMP(<value>) |
SELECT DUMP (SYSDATE) FROM dual; |
|
GREATEST |
Return the Latest Date | LEAST(<date>, <date>, <date>, ...) |
CREATE TABLE t ( datecol1 DATE, datecol2 DATE, datecol3 DATE) PCTFREE 0; INSERT INTO t VALUES (SYSDATE+23, SYSDATE-10, SYSDATE-24); INSERT INTO t VALUES (SYSDATE-15, SYSDATE, SYSDATE+15); INSERT INTO t VALUES (SYSDATE-7, SYSDATE-18, SYSDATE-9); COMMIT; SELECT * FROM t; SELECT GREATEST (datecol1, datecol2, datecol3) FROM t; |
|
INTERVAL |
Interval to adjust date-time | INTERVAL '<integer>' <unit> |
SELECT TO_CHAR(SYSDATE, 'HH:MI:SS') FROM dual; SELECT TO_CHAR(SYSDATE + INTERVAL '10' MINUTE , 'HH:MI:SS') FROM dual; SELECT TO_CHAR(SYSDATE - INTERVAL '10' MINUTE , 'HH:MI:SS') FROM dual; |
|
LAST_DAY |
Returns The Last Date Of A Month | LAST_DAY(<date>) |
SELECT * FROM t; SELECT LAST_DAY (datecol1) FROM t; |
|
LEAST |
Return the Earliest Date | LEAST(<date>, <date>, <date>, ...) |
SELECT * FROM t; SELECT LEAST (datecol1, datecol2, datecol3) FROM t; |
|
LENGTH |
Returns length in characters | LENGTH(<date>) |
SELECT LENGTH (last_ddl_time) FROM user_objects; |
|
LENGTHB |
Returns length in bytes | LENGTHB(<date>) |
SELECT LENGTHB (last_ddl_time) FROM user_objects; |
Note: Additional forms of LENGTH (LENGTHC, LENGTH2, and LENGTH4) are also available. |
|
MAX |
Return the Latest Date | MAX(<date>) |
SELECT * FROM t; SELECT MAX (datecol1) FROM t; |
|
MIN |
Return the Earliest Date | MIN(<date>) |
SELECT * FROM t; SELECT MIN (datecol1) FROM t; |
|
MONTHS_BETWEEN |
Returns The Months Separating Two Dates | MONTHS_BETWEEN(<latest_date>, <earliest_date>) |
SELECT MONTHS_BETWEEN (SYSDATE+365, SYSDATE-365) FROM dual; SELECT MONTHS_BETWEEN (SYSDATE-365, SYSDATE+365) FROM dual; |
|
NEW_TIME |
Returns the date and time in time zone zone2 when date and time in time zone zone1 are date | Before using this function, you must set the NLS_DATE_FORMAT parameter to display 24-hour time. |
SELECT NEW_TIME (TO_DATE('11-10-99 01:23:45', 'MM-DD-YY HH24:MI:SS'), 'AST', 'PST') "New Date and Time" FROM dual; ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; SELECT NEW_TIME (TO_DATE('11-10-99 01:23:45', 'MM-DD-YY HH24:MI:SS'), 'AST', 'PST') "New Date and Time" FROM dual; ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY'; |
|
NEXT_DAY |
Date of next specified date following a date | NEXT_DAY(<date>, <day of the week>) Options are SUN, MON, TUE, WED, THU, FRI, and SAT |
SELECT NEXT_DAY (SYSDATE, 'FRI') FROM dual; |
|
ROUND |
Returns date rounded to the unit specified by the format model. If you omit the format, the date is rounded to the nearest day | ROUND(<date_value>, <format>) |
SELECT ROUND (TO_DATE('27-OCT-00'),'YEAR') NEW_YEAR FROM dual; |
|
Spelled Out Using TO_CHAR |
Spelled Demo |
DDSP | HH24SP | MISP | MMSP | SSSP |
|
SELECT TO_CHAR(TO_DATE('10:30:18', 'HH24:MI:SS'), 'HH24SP :MISP:SSSP ') FROM dual; SELECT TO_CHAR(TO_DATE('01-JAN-2008', 'DD-MON-YYYY'), 'DDSP -MONTH-YYYYSP ') FROM dual; SELECT TO_CHAR(TO_DATE('01-JAN-2008', 'DD-MM-YYYY'), 'DDSP -MMSP -YYYYSP ') FROM dual; SELECT TO_CHAR(TO_DATE(sal,'J'), 'JSP') FROM emp; |
|
SYSDATE |
Returns the current session DateTime | SYSDATE |
SELECT SYSDATE FROM dual; |
|
TRUNC |
Convert a date to the date at midnight | TRUNC(<date_time>) |
CREATE TABLE t ( datecol DATE); INSERT INTO t (datecol) VALUES (SYSDATE); INSERT INTO t (datecol) VALUES (TRUNC (SYSDATE)); INSERT INTO t (datecol) VALUES (TRUNC (SYSDATE, 'HH ')); INSERT INTO t (datecol) VALUES (TRUNC (SYSDATE, 'MI ')); COMMIT; SELECT TO_CHAR(datecol, 'DD-MON-YYYY HH:MI:SS') FROM t; |
Selectively remove part of the date information Special thanks to Dave Hayes for reminding me of this. | TRUNC(<date_time>, '<format>') |
SELECT TO_CHAR(SYSDATE, 'DD-MON-YYYY HH:MI:SS') FROM dual; -- first day of the month SELECT TO_CHAR(TRUNC (SYSDATE, 'MM' ), 'DD-MON-YYYY HH:MI:SS') FROM dual; SELECT TO_CHAR(TRUNC (SYSDATE, 'MON' ), 'DD-MON-YYYY HH:MI:SS') FROM dual; SELECT TO_CHAR(TRUNC (SYSDATE, 'MONTH' ), 'DD-MON-YYYY HH:MI:SS') FROM dual; -- first day of the year SELECT TO_CHAR(TRUNC (SYSDATE, 'YYYY' ), 'DD-MON-YYYY HH:MI:SS') FROM dual; SELECT TO_CHAR(TRUNC (SYSDATE, 'YEAR' ), 'DD-MON-YYYY HH:MI:SS') FROM dual; |
Dates in WHERE Clause Joins | SELECT SYSDATE FROM dual; ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; SELECT SYSDATE FROM dual; / / ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY'; CREATE TABLE t ( datecol DATE); INSERT INTO t (datecol) VALUES (SYSDATE); SELECT * FROM t; ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; SELECT * FROM t; ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY'; SELECT * FROM t; SELECT SYSDATE FROM dual; SELECT * FROM t WHERE datecol = SYSDATE; ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; SELECT * FROM t; SELECT SYSDATE FROM dual; SELECT TRUNC (SYSDATE) FROM dual; SELECT * FROM t WHERE TRUNC (datecol) = TRUNC (SYSDATE); ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY'; |
|
VSIZE |
Returns The Number Of Bytes Required By A Value | VSIZE(e IN DATE) RETURN NUMBER |
SELECT VSIZE (SYSDATE) FROM dual; |
|
Date Calculations |
Returns A Day A Specified Number Of Days In The Future Skipping Weekends | CREATE OR REPLACE FUNCTION business_date (start_date DATE, Days2Add NUMBER) RETURN DATE IS Counter NATURAL := 0; CurDate DATE := start_date; DayNum POSITIVE; SkipCntr NATURAL := 0; BEGIN WHILE Counter < Days2Add LOOP CurDate := CurDate+1; DayNum := TO_CHAR(CurDate, 'D'); IF DayNum BETWEEN 2 AND 6 THEN Counter := Counter + 1; ELSE SkipCntr := SkipCntr + 1; END IF; END LOOP; RETURN start_date + Counter + SkipCntr; END business_date; / |
Business Date function, above, enhanced by Larry Benton to handle negative values for the days2add parameter. | CREATE OR REPLACE FUNCTION business_date (start_date DATE, days2add NUMBER) RETURN DATE IS Counter NATURAL := 0; CurDate DATE := start_date; DayNum POSITIVE; SkipCntr NATURAL := 0; Direction INTEGER := 1; -- days after start_date BusinessDays NUMBER := Days2Add; BEGIN IF Days2Add < 0 THEN Direction := - 1; -- days before start_date BusinessDays := (-1) * BusinessDays; END IF; WHILE Counter < BusinessDays LOOP CurDate := CurDate + Direction; DayNum := TO_CHAR( CurDate, 'D'); IF DayNum BETWEEN 2 AND 6 THEN Counter := Counter + 1; ELSE SkipCntr := SkipCntr + 1; END IF; END LOOP; RETURN start_date + (Direction * (Counter + SkipCntr)); END business_date; / |
Returns The First Day Of A Month | CREATE OR REPLACE FUNCTION fday_ofmonth(value_in DATE) RETURN DATE IS vMo VARCHAR2(2); vYr VARCHAR2(4); BEGIN vMo := TO_CHAR(value_in, 'MM'); vYr := TO_CHAR(value_in, 'YYYY'); RETURN TO_DATE(vMo || '-01-' || vYr, 'MM-DD-YYYY'); EXCEPTION WHEN OTHERS THEN RETURN TO_DATE('01-01-1900', 'MM-DD-YYYY'); END fday_ofmonth; / |
|
Time Calculations |
Returns The Number Of Seconds Between Two Date-Time Values | CREATE OR REPLACE FUNCTION time_diff ( DATE_1 IN DATE, DATE_2 IN DATE) RETURN NUMBER IS NDATE_1 NUMBER; NDATE_2 NUMBER; NSECOND_1 NUMBER(5,0); NSECOND_2 NUMBER(5,0); BEGIN -- Get Julian date number from first date (DATE_1) NDATE_1 := TO_NUMBER(TO_CHAR(DATE_1, 'J')); -- Get Julian date number from second date (DATE_2) NDATE_2 := TO_NUMBER(TO_CHAR(DATE_2, 'J')); -- Get seconds since midnight from first date (DATE_1) NSECOND_1 := TO_NUMBER(TO_CHAR(DATE_1, 'SSSSS')); -- Get seconds since midnight from second date (DATE_2) NSECOND_2 := TO_NUMBER(TO_CHAR(DATE_2, 'SSSSS')); RETURN (((NDATE_2 - NDATE_1) * 86400)+(NSECOND_2 - NSECOND_1)); END time_diff; / |
Calculating time from seconds Posted by John K. Hinsdale 12/30/06 to c.d.o.misc | SELECT DECODE(FLOOR(999999/86400), 0, '', FLOOR(999999/86400) || ' day(s), ') || TO_CHAR(TO_DATE(MOD(999999, 86400),'SSSSS'), 'HH24:MI:SS') AS elapsed FROM dual; |
Obtain counts per ten minute increment Posted by Michele Cadot 03/09/08 to c.d.o.misc | ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; SELECT TRUNC(SYSDATE) + dbms_random.value(0,86400)/86400 FROM dual CONNECT BY LEVEL <= 10; WITH data AS ( SELECT TRUNC(SYSDATE)+dbms_random.value(0,86400)/86400 h FROM dual CONNECT BY LEVEL <= 10) SELECT TO_CHAR(h ,'DD/MM/YYYY HH24:MI:SS') h , TO_CHAR(TRUNC(h ) + TRUNC(TO_CHAR(h ,'SSSSS')/600)/144, 'DD/MM/YYYY HH24:MI:SS') "10m" FROM data ORDER BY h ; |