将日期+时间与时间戳进行比较

时间:2013-11-11 07:47:54

标签: sql oracle

我有一个包含两个时间列的表。第一个(名称是DATE)是存储日期(不包括时间部分),因此数据类型是DATE。第二列(名称为TIME)用于以秒为单位存储时间,因此数据类型为NUMBER。

我需要将这两个日期与另一个表的时间戳进行比较。如何计算两列的日期(DATE和TIME)并与另一个表的时间戳进行比较?

我试图计算时间列的小时数并将其添加到日期列,但输出似乎不正确:

SELECT to_date(date + (time/3600), 'dd-mm-yy hh24:mi:ss') FROM mytable;

输出只是日期,而不是时间组件。

4 个答案:

答案 0 :(得分:3)

您可以使用INTERVAL DAY TO SECOND类型:

SELECT your_date + NUMTODSINTERVAL(your_time_in_seconds, 'SECOND') FROM dual;

示例:

SELECT TRUNC(SYSDATE) + NUMTODSINTERVAL(39687, 'SECOND') FROM dual;

计算的日期与时间为:10-11-2013 11:01:27

在我看来,这比将值除以3600更好,因为你有一个以秒为单位的间隔,所以使用间隔来表示你的时间是很自然的,这可以很容易地添加到DATE列中数据类型。

Oracle Interval in Documentation

NUMTODSINTERVAL Function in documentation

答案 1 :(得分:2)

date + (time/3600) is already a DATE,因此您无需执行to_date()。它确实有你添加的时间部分,你只是没有显示它。如果您希望以您显示的格式将其输出为字符串,请改为使用to_char()

SELECT to_char(date + (time/3600), 'dd-mm-yy hh24:mi:ss') FROM mytable;

...除了如果time实际上是几秒钟,你需要除以86400(24x60x60),而不是3600.目前你依赖客户的默认日期格式,可能是NLS_DATE_FORMAT,不包括你所说的时间部分。这并不意味着时间不存在,只是没有显示。

但这只是为了展示。在与时间戳进行比较时,只需添加两个值即可将其保留为日期,例如

WHERE date + (time/86400) < systimestamp

答案 2 :(得分:0)

试试这个,

 SELECT TO_DATE('11/11/2013','dd/mm/yyyy') + 3600/60/60/24 FROM DUAL;

您的查询,

SELECT date + time/60/60/24 FROM mytable;

答案 3 :(得分:0)

尝试使用 to_timestamp 代替 to_date