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

gab*_*cio 8 sql database oracle

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

考虑到午夜的定义可能有点含糊不清(午夜星期四意味着跨越星期四和星期五或跨越星期三和星期四?).

gab*_*cio 14

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

SELECT TRUNC(SYSDATE + 1) - 1/(24*60*60) FROM DUAL
SELECT TRUNC(SYSDATE + 1) - INTERVAL '1' SECOND FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

它能做什么:

  1. 总结一天SYSDATE:SYSDATE + 1,现在的日期是明天
  2. 删除时间部分日期TRUNC,现在日期是明天00:00
  3. 从日期减去一秒:- 1/(24*60*60)或者- INTERVAL '1' SECOND FROM DUAL,现在日期是今天11:59:59

注1:如果您想查看日期间隔,可能需要查看下面的@Allan答案.

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

SELECT TRUNC(SYSDATE) + INTERVAL '23:59:59'  HOUR TO SECOND FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
  1. 删除当前日期的时间部分TRUNC,现在日期为今天00:00
  2. 添加时间间隔23:59:59,现在日期是今天11:59:59

注意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
Run Code Online (Sandbox Code Playgroud)


All*_*lan 10

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

date_value >= trunc(sysdate) and date_value < trunc(sysdate) + 1
date_value >= trunc(sysdate) and date_value < trunc(sysdate) + interval '1' day
Run Code Online (Sandbox Code Playgroud)

它比使用起来更麻烦between,但它确保您的值永远不会超出您考虑的范围.