【问题标题】:Oracle Date ComparsionOracle 日期比较
【发布时间】:2015-07-28 08:21:12
【问题描述】:

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

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

任何机构都可以帮助我解决这个问题。

【问题讨论】:

  • 使用Where to_date(start_date, 'YYYY-MM-DD:HH24:MI:SS') between sysdate - 7 and sysdate;
  • 日期同时包含日期和时间元素。你没有提到要不要考虑时间因素?

标签: sql oracle date-comparison


【解决方案1】:

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

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

【讨论】:

  • 这是不正确的,因为您没有考虑时间部分。日期同时包含日期和时间元素。
  • 但我只考虑日期部分,即使它包含时间元素。
  • 为什么? OP没有提到这一点。你也没提什么。如果您查看已发布的操作 Start_date.('2011-09-17:09:46:13') 他同时具有日期和时间元素。您的查询将过滤掉那些日期之外的那些行。
【解决方案2】:

类似

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

【讨论】:

  • start_date 是 varchar2 数据类型,你必须先使用 TO_DATE 将其显式转换为日期,然后再与 SYSDATE 进行比较。
  • 是的,几分钟前发现,当人们将日期存储在 varchar 列中时,我仍然很烦
【解决方案3】:

我在 TableA 中有一个列,其中包含 Start_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);

【讨论】:

    【解决方案4】:

    虽然您应该将时间存储为 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")
    

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

    【讨论】:

    • 你真的建议比较字符串来代替日期吗?对于正在分析代码的人来说,这将是非常烦人和困惑的。有人会如何解释以下字符串2015-07-01?是1st July 还是7th Jan
    • 这是一种务实的做法。通常你永远不会考虑它,因为大于或小于对于“1989 年 7 月 1 日”等都不起作用。那个日期肯定是 7 月 1 日,因为这是 ISO-8601 日期格式
    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2012-04-28
    • 2012-02-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多