使用Oracle,如何在11:59:59选择当前日期(即SYSDATE)?
考虑到午夜might be a little ambiguous的定义(午夜星期四意味着跨越星期四和星期五或跨越星期三和星期四?)。
答案 0 :(得分:13)
要在午夜之前(之前一秒)选择当前日期(今天),您可以使用以下任何一种陈述:
SELECT TRUNC(SYSDATE + 1) - 1/(24*60*60) FROM DUAL
SELECT TRUNC(SYSDATE + 1) - INTERVAL '1' SECOND FROM DUAL;
它的作用:
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;
TRUNC
删除当前日期的时间部分,现在日期为今天00:00 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
答案 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;