Oracle 从datetime中减去一小时,而不是一天

Oracle 从datetime中减去一小时,而不是一天,oracle,datetime,plsql,date-arithmetic,Oracle,Datetime,Plsql,Date Arithmetic,我在Oracle MM/DD/YYYY中有一个datetime列HH:MM:SS AM/PM,但执行此操作时: SELECT MAX(D_DTM)-1 FROM tbl1 …可以追溯到一天以前。如何从专栏中删除一小时而不是一天 我还注意到,上午12点的日期时间记录看起来像MM/DD/YYYY,而不是MM/DD/YYYY 00:00:00;我不确定这是否重要。是-日期是整数天 如果你想要几个小时,你需要做一些数学题,比如-1/24是很好的,但是你也可以使用间隔: SELECT MAX(D_DTM

我在Oracle MM/DD/YYYY中有一个datetime列HH:MM:SS AM/PM,但执行此操作时:

SELECT MAX(D_DTM)-1 FROM tbl1
…可以追溯到一天以前。如何从专栏中删除一小时而不是一天


我还注意到,上午12点的日期时间记录看起来像MM/DD/YYYY,而不是MM/DD/YYYY 00:00:00;我不确定这是否重要。

是-日期是整数天

如果你想要几个小时,你需要做一些数学题,比如-1/24是很好的,但是你也可以使用间隔:

SELECT MAX(D_DTM)- interval '1' hour FROM tbl1
或者使用间隔函数。它有同样的结果,但我认为它读得更清楚——这当然只是一种观点:

SELECT MAX(D_DTM) - INTERVAL '1' HOUR FROM tbl1
INTERVAL函数的优点在于,在处理日期值时,可以将间隔设置为年、月、日、小时、分钟或秒,但在处理月末日期时,月间隔可能会比较复杂

是的,示例中1周围的引号是必需的

您还可以使用Oracle特定的NumToDSInterval函数,该函数不太标准,但更灵活,因为它接受变量而不是常量:

SELECT MAX(D_DTM) - NUMTODSINTERVAL(1, 'HOUR') FROM tbl1

使用间隔的另一种方法是

NUMTODSINTERVAL( number, expression )
例子

NUMTODSINTERVAL(150, 'DAY')
NUMTODSINTERVAL(1500, 'HOUR')
NUMTODSINTERVAL(15000, 'MINUTE')
NUMTODSINTERVAL(150000, 'SECOND')
我之所以提出这个问题,是因为它适用于使用INTERVAL不起作用的情况。

很简单

select sysdate - numtodsinterval(1,'hour') from dual
sysdate-5/24*60*60->从系统时间中减去5秒

sysdate-5/24*60->从系统时间中减去5分钟

sysdate-5/24->从系统时间中减去5小时

因此


从dual中选择sysdate-1/24

更好地回答IMO,让未来的编码人员更清楚地了解发生了什么您如何查看12AM值?是通过SQLPlus还是前端语言C、PHP等?使用Toad,前端是问题所在吗?我是新来的甲骨文envIt可能是蟾蜍的东西,但我不熟悉蟾蜍。如果列中的所有其他日期都显示时间成分,而午夜日期不显示,我认为可以安全地假设午夜确实存在,蟾蜍只是在帮助隐藏它。可能有一个设置,您可以打开或关闭此功能,但这只是一个猜测。我确实知道.NET语言和PHP会识别时间部分——即使它是零——而且几乎所有其他语言也会识别。你能对你的答案进行进一步的扩展吗,比如为什么要使用除法进行减法?@Codygoldner除法是以天数的分数计算值的。1小时是一天的1/24,所以5/24天是5小时。然后减法减去一天。不过,就我个人而言,我会担心浮点错误。@jpmc26的想法是这样的信息应该包含在答案中。