我在TableA中有一个列,其中包含作为列Start_date的Varchar2数据类型的日期。(' 2011-09-17:09:46:13')。
现在我需要做的是,将TableA的Start_date与SYSDATE进行比较,并列出比SYSDATE早7天的任何值。
任何人都可以帮我解决这个问题。
答案 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")
这将允许您使用索引搜索,而无需在开始日期列上使用基于函数的索引。