【问题标题】:Oracle date comparison in where clausewhere子句中的Oracle日期比较
【发布时间】:2017-09-16 02:31:10
【问题描述】:

例如,我有一个学生表,其中有一个 DOJ(加入日期)列,其类型现在设置为 DATE,因为我已经以 dd-mon-yy 格式存储了记录。

我在运行时有一个 IN 参数,日期作为字符串传递,它的格式为 dd/mm/yyyy。如何比较和获取日期的结果?

我想获取每个我的数据库表学生的 DOJ 为 25-AUG-92 的学生的记录计数,但我在 IN 参数中以 dd/mm/yyyy 格式获取日期为 varchar,请指导。

我尝试了多种选择,例如truncto_dateto_char,但不幸的是,似乎没有任何效果。

【问题讨论】:

    标签: oracle date


    【解决方案1】:

    我有一个学生表,其中包含一个 DOJ(加入日期)列,其类型设置为 DATE,因为我已经以 dd-mon-yy 格式存储了记录。

    不完全是,DATE 数据类型没有格式;它以7-bytes 的形式在内部存储在表中(年为 2 个字节,月、日、小时、分钟和秒均为 1 个字节)。您正在使用的用户界面(即 SQL/PLUS、SQL Developer、Toad 等)将处理 DATE 从二进制格式到人类可读格式的格式。在 SQL/Plus(或 SQL Developer)中,此格式基于 NLS_DATE_FORMAT session parameter

    如果DATE 仅使用日、月和年输入,则时间组件(可能)将设置为00:00:00(午夜)。

    我在运行时有一个 IN 参数,日期作为字符串传递,或者说 varchar 及其 dd/mm/yyyy 格式。如何比较和获取日期的结果。

    假设 DOJ 栏的时间部分始终是午夜:

    SELECT COUNT(*)
    FROM   students
    WHERE  doj = TO_DATE( your_param, 'dd/mm/yyyy' )
    

    如果不总是午夜,那么:

    SELECT COUNT(*)
    FROM   students
    WHERE  TRUNC( doj ) = TO_DATE( your_param, 'dd/mm/yyyy' )
    

    或:

    SELECT COUNT(*)
    FROM   students
    WHERE  doj >= TO_DATE( your_param, 'dd/mm/yyyy' )
    AND    doj <  TO_DATE( your_param, 'dd/mm/yyyy' ) + INTERVAL '1' DAY
    

    【讨论】:

    • 很好的答案.. 您可能想补充一点,TRUNC(doj) 选项会阻止 Oracle 在 doj 上使用大多数索引,这就是为什么您的最后一个选项在实践中经常出现,尽管更长而且更复杂。
    【解决方案2】:

    下面的应该做你所描述的。如果不是,请提供有关“似乎没有任何工作”的更多信息。

    -- Get the count of students with DOJ = 25-AUG-1992
    SELECT COUNT(1)
    FROM STUDENT
    WHERE TRUNC(DOJ) = TO_DATE('25/AUG/1992','dd/mon/yyyy');
    

    以上内容来自this answer。您可能想查看答案,因为如果性能对您很重要,则可以使用另一种方法来编写此查询,它不使用 trunc,这将允许 Oracle 在 DOJ 上使用索引(如果存在)。

    【讨论】:

      【解决方案3】:

      虽然我发布这个有点晚,但我已经能够解决这个问题。

      我所做的是将两个日期都转换为类似格式的 to_char,它在这里有效的是我的查询条件有效..

      TO_CHAR(TO_DATE(C.DOB, 'DD-MON-YY'),'DD-MON-YY')=TO_CHAR(TO_DATE(P_Dob,'DD/MM/YYYY'),'DD-MON-YY'))
      

      感谢大家的支持。 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-02
        • 1970-01-01
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多