Oracle:如何在午夜之前选择当前日期(今天)?

时间:2014-10-03 16:00:02

标签: sql database oracle

使用Oracle,如何在11:59:59选择当前日期(即SYSDATE)?

考虑到午夜might be a little ambiguous的定义(午夜星期四意味着跨越星期四和星期五或跨越星期三和星期四?)。

3 个答案:

答案 0 :(得分:13)

要在午夜之前(之前一秒)选择当前日期(今天),您可以使用以下任何一种陈述:

SELECT TRUNC(SYSDATE + 1) - 1/(24*60*60) FROM DUAL
SELECT TRUNC(SYSDATE + 1) - INTERVAL '1' SECOND FROM DUAL;

它的作用:

  1. 总结一天到SYSDATESYSDATE + 1,现在日期是明天
  2. 使用TRUNC删除日期的部分时间,现在日期为明天00:00
  3. 从日期减去一秒:- 1/(24*60*60)- INTERVAL '1' SECOND FROM DUAL,现在日期是今天11:59:59
  4. 注1:如果您想查看日期间隔,可以查看下面的@Allan答案。

    注2:作为替代方案,您可以使用另一个(更容易阅读):

    SELECT TRUNC(SYSDATE) + INTERVAL '23:59:59'  HOUR TO SECOND FROM DUAL;
    
    1. 使用TRUNC删除当前日期的时间部分,现在日期为今天00:00
    2. 添加23:59:59的时间间隔,现在日期为今天11:59:59
    3. 注3:要检查结果,您可能需要添加格式:

      SELECT TO_CHAR(TRUNC(SYSDATE + 1) - 1/(24*60*60),'yyyy/mm/dd hh24:mi:ss') FROM DUAL
      SELECT TO_CHAR(TRUNC(SYSDATE + 1) - INTERVAL '1' SECOND,'yyyy/mm/dd hh24:mi:ss') FROM DUAL
      SELECT TO_CHAR(TRUNC(SYSDATE) + INTERVAL '23:59:59','yyyy/mm/dd hh24:mi:ss') FROM DUAL
      

答案 1 :(得分:9)

就个人而言,我不喜欢在午夜之前使用一秒钟。除此之外,如果你使用的是timestamp,那么你可能会比较差距之间的值(即23:59:59.1)。由于这种逻辑通常被用作范围条件的边界,我建议使用"少于午夜"而不是"在午夜之前小于或等于一秒#&# 34;如果可能的话。这种语法也简化了。例如,要获得代表"今天"的时间范围,您可以使用以下任一项:

date_value >= trunc(sysdate) and date_value < trunc(sysdate) + 1
date_value >= trunc(sysdate) and date_value < trunc(sysdate) + interval '1' day

它比使用between稍微麻烦一点,但它确保您的值永远不会超出您考虑的范围。

答案 2 :(得分:3)

真正含糊不清的可能是leap seconds并且可能是夏令时(但我不知道是否有某些情况会在午夜时更改)。

无论如何,对于通常情况,解决方案很少:

-- all of these will produce a `DATE` result:
SELECT TRUNC(SYSDATE+1)-1/86400 FROM DUAL;
SELECT TRUNC(SYSDATE+1) - INTERVAL '1' SECOND FROM DUAL;
SELECT TRUNC(SYSDATE) + INTERVAL '23:59:59'  HOUR TO SECOND FROM DUAL;

如果你使用时间戳,有些奇怪:

  • TRUNC会默默地将值转换为DATE;
  • NUMBER之间添加/减去TIMESTAMP也会产生DATE。 有关详细信息,请参阅Datetime/Interval Arithmetic
-- those two will produce a `DATE` *too*, not a `TIMESTAMP`:
SELECT TRUNC(SYSTIMESTAMP) + INTERVAL '23:59:59'  HOUR TO SECOND FROM DUAL;

SELECT TO_TIMESTAMP(TRUNC(SYSTIMESTAMP+1))-1/86400 FROM DUAL;