1

我有一个带有 LOAD_STRT_DTM 列的表。这是一个日期列,值是这样的 - 18-JUL-14 08.20.34.000000000 AM。

我想找到 5 天之前的数据。

我的逻辑是——

Select * from Table where 24 *(To_DATE(Sysdate,'DD-MM-YY') - To_DATE(LOAD_STRT_DTM,'DD-MM-YY')) >120

问题是——

Select (To_DATE(Sysdate,'DD-MM-YY') - To_DATE(LOAD_STRT_DTM,'DD-MM-YY')) from table 

此查询应给出两个日期之间的 NumberOfDays。但这不起作用,我怀疑,问题是由于 LOAD_STRT_DTM 列的格式。

请让我知道我在哪里做错了。

4

4 回答 4

1

如果您的列是 DATE 数据类型,一切正常,只需拍摄:

select * from table where LOAD_STRT_DTM > sysdate - 5;

无需将日期转换为 DATE 数据类型。

于 2015-03-18T12:08:44.973 回答
1

(To_DATE(Sysdate,'DD-MM-YY') - To_DATE(LOAD_STRT_DTM,'DD-MM-YY'))

您不必再次将 DATE 转换为 DATE。它已经是一个日期。您只需将其用于日期计算。您使用TO_DATESTRING转换为DATE

例如,如果您有一个类似 的字符串值'18-JUL-14',那么您需要使用 将其转换为日期TO_DATE。由于您的列是 DATE 数据类型,因此您只需要按原样使用即可。

这是一个日期列

我想找到 5 天之前的数据。

只需将过滤谓词用作:

WHERE load_strt_dtm > SYSDATE - 5;

注意:SYSDATE 有日期和时间元素,所以它也会根据时间进行过滤。如果您只想在过滤条件中使用日期部分,那么您可以使用TRUNC。它会截断时间元素。

我已经回答了一个类似的问题,看看这个https://stackoverflow.com/a/29005418/3989608

于 2015-03-18T12:30:37.637 回答
0

考虑到秒后的小数点数,它看起来像是LOAD_STRT_DTMaTIMESTAMP而不是 a 。DATE唯一需要注意的是,Oracle 会将DATEaTIMESTAMP隐式转换为 a ,其中一个操作数是 a TIMESTAMP。所以解决方案

WHERE load_strt_dtm > SYSDATE - 5

将工作; 一样

WHERE load_strt_dtm + 5 > SYSDATE

但以下不会:

WHERE SYSDATE - load_start_dtm < 5

原因是TIMESTAMP算术产生 aINTERVAL而不是 a NUMBER

于 2015-03-18T14:14:00.653 回答
-3

首先将两个日期转换为相同的格式 select datediff(dd,convert(varchar(20),'2015-01-01',112),convert(varchar(20),'01-10-2015',112))

于 2015-03-18T12:06:42.723 回答