我有一个包含两个时间列的表。第一个(名称是DATE)是存储日期(不包括时间部分),因此数据类型是DATE。第二列(名称为TIME)用于以秒为单位存储时间,因此数据类型为NUMBER。
我需要将这两个日期与另一个表的时间戳进行比较。如何计算两列的日期(DATE和TIME)并与另一个表的时间戳进行比较?
我试图计算时间列的小时数并将其添加到日期列,但输出似乎不正确:
SELECT to_date(date + (time/3600), 'dd-mm-yy hh24:mi:ss') FROM mytable;
输出只是日期,而不是时间组件。
答案 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列中数据类型。
答案 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