0

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

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

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

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

输出只是日期,而不是时间部分。

4

4 回答 4

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 间隔

NUMTODSINTERVAL 文档中的函数

于 2013-11-11T07:54:05.263 回答
2

date + (time/3600) 已经是一个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
于 2013-11-11T07:54:04.280 回答
0

像这样试试

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

您的查询,

SELECT date + time/60/60/24 FROM mytable;
于 2013-11-11T07:56:07.097 回答
0

尝试使用to_timestamp而不是to_date

于 2013-11-11T08:05:45.913 回答