12
Oracle Date Functions Version 11.1 e rent Date RENT_DATE DATE ECT TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY HH:MI:SS') FROM dual; ECT TO_CHAR(SYSDATE, 'DD-MON-YYYY HH:MI:SS') FROM dual; mats Day Month Year Fill Mode Julian Date D MM YY FM J DD MON YYYY DDTH RR DAY RRRR ND - + te> + <integer>

Date Functions in SQL

Embed Size (px)

DESCRIPTION

Date Functions in SQL

Citation preview

Page 1: Date Functions in SQL

Oracle Date FunctionsVersion 11.1

DateCurrent DateCURRENT_DATESYSDATESELECT 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

DayMonthYear

Fill ModeJulian Date

DMMYYFMJDDMONYYYY  

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

Page 2: Date Functions in SQL

ADD_MONTHS(<date>, <number of months_integer>SELECT add_months(SYSDATE, 2) FROM dual;

-- but be aware of what it is doingSELECT 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 in the session time zone, in a value in the Gregorian calendar of datatype DATE

col sessiontimezone format a30

SELECT sessiontimezone, current_dateFROM dual;

ALTER SESSION SET TIME_ZONE = '-5:0';

SELECT sessiontimezone, current_dateFROM dual;

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';

SELECT sessiontimezone, current_dateFROM dual;

ALTER SESSION SET TIME_ZONE = '-7:0';

SELECT sessiontimezone, current_dateFROM dual;

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';

DUMP

Returns a VARCHAR2 value containing the datatype code, length in bytes, and internal representation of a valueDUMP(<value> [,<return_format>[,<start_position>[,<length>]]])

8

Page 3: Date Functions in SQL

Octal10

Decimal16

Hexidecimal17

Single Characters1008

octal notation with the character set name1010

decimal notation with the character set name1016

hexadecimal notation with the character set name1017

single characters with the character set namecol drows format a40

SELECT DUMP(SYSDATE) DROWS FROM dual;

SELECT DUMP(SYSDATE, 8) DROWS FROM dual;

SELECT DUMP(SYSDATE, 16) DROWS FROM dual;

GREATEST

Return the Latest DateLEAST(<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-timeINTERVAL '<integer>' <unit>SELECT TO_CHAR(SYSDATE, 'HH:MI:SS')FROM dual;

SELECT TO_CHAR(SYSDATE + INTERVAL '10' MINUTE, 'HH:MI:SS')FROM dual;

Page 4: Date Functions in SQL

SELECT TO_CHAR(SYSDATE - INTERVAL '10' MINUTE, 'HH:MI:SS')FROM dual;

LAST_DAYReturns The Last Date Of A MonthLAST_DAY(<date>)SELECT * FROM t;

SELECT LAST_DAY(datecol1) FROM t;

LEASTReturn the Earliest DateLEAST(<date>, <date>, <date>, ...)SELECT * FROM t;

SELECT LEAST(datecol1, datecol2, datecol3) FROM t;

LENGTHReturns length in charactersLENGTH(<date>)SELECT LENGTH(last_ddl_time) FROM user_objects;

LENGTHBReturns length in bytesLENGTHB(<date>)SELECT LENGTHB(last_ddl_time) FROM user_objects;Note: Additional forms of LENGTH (LENGTHC, LENGTH2, and LENGTH4) are also available.

MAXReturn the Latest DateMAX(<date>)SELECT * FROM t;

SELECT MAX(datecol1) FROM t;

MINReturn the Earliest DateMIN(<date>)SELECT * FROM t;

SELECT MIN(datecol1) FROM t;

MONTHS_BETWEENReturns The Months Separating Two DatesMONTHS_BETWEEN(<latest_date>, <earliest_date>)SELECT MONTHS_BETWEEN(SYSDATE+365, SYSDATE-365) FROM dual;

SELECT MONTHS_BETWEEN(SYSDATE-365, SYSDATE+365) FROM dual;

Page 5: Date Functions in SQL

NEW_TIME

Returns the date and time in time zone zone2 when date and time in time zone zone1 are dateBefore 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_DAYDate of next specified date following a dateNEXT_DAY(<date>, <day of the week>)

Options are SUN, MON, TUE, WED, THU, FRI, and SATSELECT NEXT_DAY(SYSDATE, 'FRI') FROM dual;

ROUNDReturns date rounded to the unit specified by the format model. If you omit the format, the date is rounded to the nearest dayROUND(<date_value>, <format>)SELECT ROUND(TO_DATE('27-OCT-00'),'YEAR') NEW_YEARFROM dual;

Spelled Out Using TO_CHAR

Spelled DemoDDSP

HH24SPMISPMMSPSSSP

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;

Page 6: Date Functions in SQL

SYSDATEReturns the current date and time set for the operating system on which the database residesSYSDATESELECT SYSDATE FROM dual;

TRUNC

Convert a date to the date at midnightTRUNC(<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 monthSELECT 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 yearSELECT 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;

Page 7: Date Functions in SQL

Dates in WHERE Clause JoinsSELECT 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 tWHERE 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 tWHERE TRUNC(datecol) = TRUNC(SYSDATE);

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';

VSIZE

Page 8: Date Functions in SQL

Returns The Number Of Bytes Required By A ValueVSIZE(e IN DATE) RETURN NUMBERSELECT VSIZE(SYSDATE) FROM dual;

Date Calculations

Returns A Day A Specified Number Of Days In The Future Skipping WeekendsCREATE OR REPLACE FUNCTION business_date (start_date DATE,Days2Add NUMBER) RETURN DATE ISCounter  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 ISCounter NATURAL := 0;CurDate DATE := start_date;DayNum POSITIVE;SkipCntr NATURAL := 0;Direction INTEGER := 1;  -- days after start_dateBusinessDays 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

Page 9: Date Functions in SQL

    SkipCntr := SkipCntr + 1;  END IF; END LOOP;

RETURN start_date + (Direction * (Counter + SkipCntr));END business_date;

Returns The First Day Of A MonthCREATE OR REPLACE FUNCTION fday_ofmonth(value_in DATE)RETURN DATE ISvMo 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 ValuesCREATE 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;

Page 10: Date Functions in SQL

Calculating time from seconds

Posted by John K. Hinsdale12/30/06 to c.d.o.miscSELECT 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 Cadot03/09/08 to c.d.o.miscALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';

SELECT TRUNC(SYSDATE) + dbms_random.value(0,86400)/86400FROM dualCONNECT 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 dataORDER BY h;