Oracle Date Comparsion

时间:2015-07-28 08:21:13

标签: sql oracle date-comparison

我在TableA中有一个列,其中包含作为列Start_date的Varchar2数据类型的日期。(' 2011-09-17:09:46:13')。

现在我需要做的是,将TableA的Start_date与SYSDATE进行比较,并列出比SYSDATE早7天的任何值。

任何人都可以帮我解决这个问题。

4 个答案:

答案 0 :(得分:2)

您可以执行以下操作来检查日期:

select * from 
TableA
where
to_date(start_date,'YYYY-MM-DD') between sysdate and sysdate-7;

答案 1 :(得分:1)

类似

select * from tableA
where start_date between sysdate-7 and sysdate

答案 2 :(得分:1)

  

我在TableA中有一个列,其中包含Date_date列的Varchar2数据类型的日期。('2011-09-17:09:46:13')。

然后你有一个有缺陷的设计。您必须为数据使用适当的数据类型。日期时间应始终存储为 DATE 数据类型。

  

现在我需要做的是,将TableA的Start_date与SYSDATE进行比较,并列出比SYSDATE早7天的任何值。

由于您的列的数据类型为 VARCHAR2 ,您必须使用 TO_DATE 将字符串显式转换为日期。

where to_date(start_date,'YYYY-MM-DD HH24:MI:SS') between sysdate and sysdate-7;

请注意, DATE 同时包含日期和时间元素。如果您想忽略时间部分,则需要使用 TRUNC

例如,

SQL> alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';

Session altered.

SQL> SELECT sysdate FROM DUAL;

SYSDATE
-------------------
2015-07-28 16:03:32

SQL> SELECT TRUNC(sysdate) FROM DUAL;

TRUNC(SYSDATE)
-------------------
2015-07-28 00:00:00

SQL>

因此,BETWEEN sysdate AND sysdate -7将考虑当前的日期时间直到过去7天,直到该时间部分。如果您只想考虑日期部分,请使用 TRUNC

例如,

where to_date(start_date,'YYYY-MM-DD') between TRUNC(sysdate) and TRUNC(sysdate-7);

答案 3 :(得分:1)

虽然您应该将您的时间存储为DATE数据类型,但您至少以允许大于/小于比较的格式存储日期。

因此,虽然您应该将这些列转换为日期,或者将值转换为日期以便与SYSDATE -7进行比较,但您也可以将SYSDATE -7转换为与存储时相同的字符串格式。

例如:

start_date between to_char(sysdate -7, "YYYY-MM-DD HH24:MI:SS") and
                   to_char(sysdate   , "YYYY-MM-DD HH24:MI:SS")

这将允许您使用索引搜索,而无需在开始日期列上使用基于函数的索引。