如何在SQL中区分不同格式的2个日期

时间:2015-03-18 11:50:59

标签: sql oracle sql-date-functions

我有一个包含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 个答案:

答案 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_DTMTIMESTAMP而不是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))