如何在PL SQL中创建日期开始和结束日期

时间:2015-09-08 09:51:23

标签: sql oracle plsql

我要做的是创建两个时间戳,StartDate时间戳为09/08/2015 00:00:00EndDate时间戳应为09/08/2015 23:59:59,就像它一样简单要在MS SQL中实现,我无法找到Make_Date函数或Add_Days函数来获取Oracle PL SQL中的任何一个时间戳。

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:5)

不是使用小数86399 / 86400(这需要在查看代码以查看为什么选择这些神奇数字时需要一些工作)才能获得结束日期,您可以使用INTERVALS明确说明时间段(一眼就能看出你在做什么):

SQL Fiddle

Oracle 11g R2架构设置

查询1

SELECT TRUNC( CURRENT_DATE ) AS START_DATE,
       TRUNC( CURRENT_DATE ) + INTERVAL '1' DAY - INTERVAL '1' SECOND AS END_DATE
FROM   DUAL

<强> Results

|                  START_DATE |                    END_DATE |
|-----------------------------|-----------------------------|
| September, 08 2015 00:00:00 | September, 08 2015 23:59:59 |

答案 1 :(得分:3)

使用 TO_DATE 字符串转换为日期

SQL> alter session set nls_date_format='mm/dd/yyyy hh24:mi:ss';

Session altered.

SQL> SELECT to_date('09/08/2015 00:00:00' ,'mm/dd/yyyy hh24:mi:ss') start_date,
  2         to_date('09/08/2015 23:59:59' ,'mm/dd/yyyy hh24:mi:ss') end_date
  3  FROM dual;

START_DATE          END_DATE
------------------- -------------------
09/08/2015 00:00:00 09/08/2015 23:59:59

SQL>

您还可以使用 ANSI TIMESTAMP Literal

SQL> SELECT TIMESTAMP '2015-08-09 00:00:00' start_date,
  2         TIMESTAMP '2015-08-09 23:59:59' end_date
  3  FROM dual;

START_DATE                   END_DATE
---------------------------- -------------------------------
09-AUG-15 12.00.00.000000000 09-AUG-15 11.59.59.000000000 PM

SQL>

更新 OP希望日期文字是动态的。

SQL> SELECT TRUNC(SYSDATE)                 start_date,
  2         TRUNC(SYSDATE) + 86399 / 86400 end_date
  3  FROM dual;

START_DATE          END_DATE
------------------- -------------------
09/08/2015 00:00:00 09/08/2015 23:59:59

更新2 OP想知道时间部分隐藏在日期中的原因。

SQL> alter session set nls_date_format='mm/dd/yyyy';

Session altered.

SQL> SELECT sysdate FROM DUAL;

SYSDATE
----------
09/08/2015

SQL> alter session set nls_date_format='mm/dd/yyyy hh24:mi:ss';

Session altered.

SQL> SELECT sysdate FROM DUAL;

SYSDATE
-------------------
09/08/2015 15:46:14

那么,上面发生了什么?相同的 SYSDATE 会返回两个不同的值。原因是 DATE 同时包含 datetime 元素,您看到的内容取决于您的区域设置特定NLS设置所驱动的显示属性。

  

使用 TO_CHAR 将日期转换为字符串,以便在您的帐号中显示   期望的格式。

答案 2 :(得分:2)

使用表中的值:

SELECT
    DATE_VALUE,
    TRUNC(DATE_VALUE) START_DATE,
    TRUNC(DATE_VALUE) + 86399 / 86400 END_DATE
FROM
    (SELECT SYSDATE - LEVEL + 1 DATE_VALUE FROM DUAL CONNECT BY LEVEL <= 10)