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)
它能做什么:
SYSDATE
:SYSDATE + 1
,现在的日期是明天TRUNC
,现在日期是明天00:00- 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)
TRUNC
,现在日期为今天00:0023: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
,但它确保您的值永远不会超出您考虑的范围.