我有一个包含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列的格式。
请让我知道我在哪里做错了。
答案 0 :(得分:1)
如果您的列是DATE数据类型,一切正常,只需拍摄:
select * from table where LOAD_STRT_DTM > sysdate - 5;
无需将日期转换为DATE数据类型。
答案 1 :(得分:1)
(To_DATE(Sysdate,'DD-MM-YY') - To_DATE(LOAD_STRT_DTM,'DD-MM-YY'))
您不必再将DATE转换为DATE。 IT已经是DATE了。您只需将其用于日期计算。您使用 TO_DATE 将 STRING 转换为 DATE 。
例如,如果您的字符串值类似于'18-JUL-14'
,那么您需要使用TO_DATE
将其转换为日期。由于您的列是DATE数据类型,因此您只需按原样使用。
这是日期栏
我想找到5天前的数据。
只需将过滤谓词用作:
WHERE load_strt_dtm > SYSDATE - 5;
注意:SYSDATE同时包含日期和时间元素,因此它也会根据时间进行过滤。如果您只想在过滤条件中使用日期部分,则可以使用 TRUNC 。 IT会截断时间元素。
我已回答了类似问题,请查看此https://stackoverflow.com/a/29005418/3989608
答案 2 :(得分:0)
考虑到秒后的小数点数,看起来LOAD_STRT_DTM
是TIMESTAMP
而不是DATE
。您唯一需要谨慎的是,Oracle将隐式地将DATE
转换为TIMESTAMP
,其中一个操作数为TIMESTAMP
。所以解决方案
WHERE load_strt_dtm > SYSDATE - 5
会奏效;将会
WHERE load_strt_dtm + 5 > SYSDATE
但以下不会:
WHERE SYSDATE - load_start_dtm < 5
原因是TIMESTAMP
算术生成INTERVAL
而不是NUMBER
。
答案 3 :(得分:-3)
首先将两个日期转换为相同的格式选择datediff(dd,convert(varchar(20),&#39; 2015-01-01&#39;,112),convert(varchar(20),&#39; 01 -10-2015&#39; 112))