Oracle Date Functions

Oracle Date Functions
Version 11.1
 
Would you like to take a class from Ace Director Dan Morgan the author of this library?

"Database Essentials" class begin when you register at 
SQL University .
Try the free Sample Courses and then check out the list of classes and topics.
zz
 

Have you seen our new Functions page? If not ...  Click Here   ... for instant access to all Oracle functions

 
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 ;
 http://blog.youkuaiyun.com/tingqier/archive/2008/10/08/3033884.aspx
Related Topics
Cast
Conversion Functions
Miscellaneous Functions
Numeric Functions
String Functions
Timestamp
<think>嗯,用户想了解如何使用date函数,或者找到相关的文档。首先,我需要确认他们指的是哪个环境下的date函数,因为不同的编程语言和数据库可能有不同的实现。比如,用户提供的引用中有提到Oracle数据库的date函数和C语言、Java的nextDate函数。可能用户混淆了不同的date函数,或者需要特定环境下的指导。 首先,看看用户提供的引用内容。引用[1]、[3]提到的是NextDate函数,用于计算给定日期的下一天,属于特定功能的实现,可能是在测试用例设计中的例子。引用[2]提到的是Oracledate函数,特别是使用to_char和sysdate来格式化日期输出。用户的问题可能涉及这两个方面,或者是更通用的date函数使用。 接下来,用户的问题比较笼统,直接问“如何使用date函数 或 date函数文档”。可能需要分情况讨论,不同系统下的date函数。例如,在SQL(如Oracle)、编程语言(如Python、Java)中的date处理函数,或者Shell命令中的date命令。但根据用户提供的引用,重点可能在Oracle和编程中的实现,比如NextDate函数。 可能需要先解释常见的date函数使用场景,例如在数据库中如何格式化日期,在编程中如何操作日期。例如,Oracle中的TO_DATE和TO_CHAR函数,Python中的datetime模块。同时,用户提到的nextDate函数可能涉及到日期计算的逻辑,比如处理月份的最后一天、闰年等边界情况。 另外,用户可能对测试NextDate函数感兴趣,因为引用[1]和[3]都提到了等价类划分法设计测试用例,这可能需要考虑不同的输入情况,如月份为12月时年份递增,日期为31日时月份递增等。因此,在回答时除了说明如何使用date函数外,可能还需要涉及如何正确实现日期计算,并设计测试用例。 需要确保回答结构清晰,分点说明不同环境下的date函数用法,并提供示例。同时,根据用户提供的引用,可能需要引用相关的例子,比如Oracle中的日期格式化,或者NextDate函数的实现注意事项。 还需要注意用户提到的LaTeX格式要求,所有数学表达式或代码需要用正确的格式,比如Oracle的SQL代码需要用代码块包裹,Python示例也需要正确格式。同时,生成相关问题,引导用户进一步思考或解决可能遇到的问题。 最后,确保回答真实可靠,引用提供的资料,如引用[2]中的Oracle函数示例,引用[1]和[3]中的NextDate函数测试用例设计方法。可能还需要补充一些常见的date函数用法,比如在JavaScript或Excel中的情况,但根据现有引用,重点应放在Oracle和编程实现上。</think>### Date函数用法解析 #### 一、Date函数基础 Date函数在不同系统中功能各异,主要分为两类: 1. **数据库Date函数**(如Oracle) 用于日期格式化、计算和转换。例如: ```sql SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual; --格式化当前时间[^2] SELECT TO_DATE('20231001', 'YYYYMMDD') FROM dual; --字符串转日期[^2] ``` 2. **编程语言Date函数** 例如Python的`datetime`模块: ```python from datetime import datetime, timedelta today = datetime.now() tomorrow = today + timedelta(days=1) # 计算下一天 ``` #### 二、NextDate函数实现要点 根据引用[1][^1][^3],NextDate函数需处理以下边界: 1. **月末处理** 例如输入`2004-11-30`,输出应为`2004-12-01`,需判断月份天数: ```python if day >= month_max_days[month]: month += 1 day = 1 ``` 2. **闰年判断** 二月份天数计算规则: $$ \text{闰年条件} = (year \% 4 = 0 \land year \% 100 \neq 0) \lor (year \% 400 = 0) $$ #### 三、测试用例设计(等价类划分法) 根据引用[1],输入域划分示例: | 输入条件 | 有效等价类 | 无效等价类 | |---------|------------|------------| | Month | 1-12 | <1 或 >12 | | Day | 1-31 | <1 或 >31 | | Year | 1912-2050 | <1912 或 >2050 | 测试用例示例: 1. **有效输入**:`2023-10-15` → `2023-10-16` 2. **跨月输入**:`2023-12-31` → `2024-01-01` 3. **无效输入**:`2023-02-30` → 报错提示 #### 四、参考资料指引 1. **Oracle官方文档** 搜索关键词:`Oracle DATE functions` 或 `TO_CHAR format models` 2. **Python日期处理** 参考[Python datetime文档](https://docs.python.org/3/library/datetime.html) 3. **边界测试方法** 可查阅《软件测试技术实战》第4章等价类划分法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值