2013-04-18 107 views
5

1小时我在甲骨文datetime柱(MM/DD/YYYY HH:MM:SS AM/PM),但是当我这样做:减去日期时间,而超过一天

SELECT MAX(D_DTM)-1 FROM tbl1 

。它回来了一天。我如何从列中删除一个小时而不是一天?

我也注意到,datetime记录12AM样子MM/DD/YYYY而不是MM/DD/YYYY 00:00:00;我不确定这是否重要。

+0

你如何观看12AM值?它是通过SQLPlus还是前端语言(C#,PHP等等)? –

+0

使用蟾蜍,是前端的问题?我是新的Oracle env – user2061886

+0

它可能是一个TOAD的东西,但我不熟悉TOAD。如果列中的所有其他日期显示时间分量,而“午夜”日期则不显示,我认为可以安全地假设“午夜”真的在那里,而TOAD只是“有用地”隐藏它。可能有一个设置可以打开或关闭此功能,但这只是一个猜测。我知道.NET语言和PHP会识别时间部分 - 即使它是零 - 也可能几乎所有其他语言都会。 –

回答

13

Randy's answer是好的,但你也可以使用间隔:

SELECT MAX(D_DTM)- interval '1' hour FROM tbl1 
+0

更好的答案国际海事组织,更清楚为未来的编码人员知道最新情况 – user2061886

4

是 - 日期以整数天为单位。

如果你想要小时,你需要做一些数学 - 像-(1/24)

5

或者使用INTERVAL功能。它具有相同的结果,但我认为它会读取更清晰 - 这当然只是一个意见:)

SELECT MAX(D_DTM) - INTERVAL '1' HOUR FROM tbl1 

有关INTERVAL功能的好处是,你可以做的时间间隔是年,月,日,小时,处理DATE值时需要几分钟或几秒钟,但在处理月末日期时,月份间隔可能会非常棘手。

是的,在这个例子中围绕1的引用是必需的。

您还可以使用Oracle特有NumToDSInterval功能,这是不太标准,但更灵活,因为它接受变量,而不是常量:

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

使用间隔的另一种方法是

NUMTODSINTERVAL(number, expression) 

示例

NUMTODSINTERVAL(150, 'DAY') 
NUMTODSINTERVAL(1500, 'HOUR') 
NUMTODSINTERVAL(15000, 'MINUTE') 
NUMTODSINTERVAL(150000, 'SECOND') 

我把这个提起来beca使用它对于使用INTERVAL无法工作的情况非常有用。

4
select sysdate - numtodsinterval(1,'hour') from dual 
1

它很简单。

SYSDATE - 5 /(24 * 60 * 60) - >减去5秒内从SYSTIME

SYSDATE - 5 /(24 * 60) - >从SYSTIME

SYSDATE减去5分钟 - 5 /(24) - >减去SYSTIME

5小时因此

选择(SYSDATE - (1/24))从双

+0

你可以扩大一点你的答案,如为什么你使用除法? –

+0

@CodyGuldner该部门正在计算价值的一小部分天数。 (1小时是一天的1/24,所以5/24天是5小时。)减去然后减去一天。但是,就我个人而言,我会担心浮点错误。 – jpmc26

+0

@ jpmc26想法是这样的信息应该包含在答案中。 –