【问题标题】:oracle date range甲骨文日期范围
【发布时间】:2011-01-03 13:50:24
【问题描述】:

使用 Oracle 10g 数据库,我有一个类似这样的表:

 create table x(
 ID NUMBER(10) primary key,
 wedding DATE NOT NULL
 );

我该怎么做

 select * from x where wedding is in june 2008???

我知道这可能是一个简单的问题,但到目前为止我找不到任何令人满意的答案。 非常感谢您的帮助。

【问题讨论】:

    标签: sql oracle date plsql oracle10g


    【解决方案1】:

    用途:

    SELECT *
      FROM x
     WHERE x.wedding BETWEEN TO_DATE('2008-JUN-01', 'YYYY-MON-DD') 
                                AND TO_DATE('2008-JUL-01', 'YYYY-MON-DD')
    

    使用TO_DATE 构造一个时间部分为00:00:00 的日期,这要求结束日期提前一天,除非您想使用逻辑将当前日期更正为午夜前一秒。未经测试:

    TO_DATE('2008-JUN-30', 'YYYY-MON-DD') + 1 - (1/(24*60*60))
    

    这应该在 2008 年 6 月 30 日加上一天,然后减去一秒以返回最终日期 30-Jun-2008 23:59

    参考资料:

    【讨论】:

    • ORACLE 中的DATE 类型包含日期和时间组件。表达式 TO_DATE('2008-JUN-30', 'YYYY-MON-DD') 等于 '2008-JUN-30 00:00:00' 。如果数据包含时间信息,那么您可能会遇到此表达式的问题。发生在“2008-JUN-30 16:00:00”(下午 4 点)的婚礼不会出现在上述查询的结果集中。
    • 所以我应该将其设置为 6 月 1 日和 7 月 1 日之间。
    • Re "使用 TO_DATE ..." - 我同意如果你有时间和日期的话会更复杂一些。您当前的上限:TO_DATE('2008-JUL-01', 'YYYY-MON-DD') 现在可以从 2008-JUL-01 获得没有输入时间的婚礼(我假设没有午夜婚礼),所以这个查询可能不准确。您可能需要详细说明边缘情况并在时间部分和 BETWEEN 运算符上添加一些评论。
    • @Hoax - 如果您在 x.wedding 中没有时间组件,那么第一个版本很好:TO_DATE('2008-JUN-30', 'YYYY-MON-DD')。否则,您应该将上限设置为2008-JUN-30 23:59:59。检查 TO_DATE 文档以获取正确的掩码。
    • @zendar:如果未指定,Oracle 会将时间部分默认为 00:00:00,我认为这是您的真正观点。这就是我为午夜前一秒的日期时间添加逻辑的原因。
    【解决方案2】:

    这是 ANSI SQL,从版本 9i 开始受 oracle 支持

    SELECT *
    FROM   x
    WHERE  EXTRACT(YEAR  FROM wedding) = 2008
    AND    EXTRACT(MONTH FROM wedding) =   06
    

    Oracle 特定的经典解决方案TO_CHAR():

    SELECT *
    FROM   x
    WHERE  TO_CHAR(wedding, 'YYYY-MMM') = '2008-JUN'
    

    (当恐龙还在地球上行走时,支持后一种解决方案)

    【讨论】:

    • 两者都不会在wedding 列上使用索引(如果存在)。
    • 另外,如果启用了 PLW 错误 - 这两个选项都将导致转换远离数据类型错误。
    • @OMG Ponies - 是的,你是对的。之间的解决方案对于性能来说要好得多。不过,不确定您所说的 PLW 错误是什么意思。你有指针给我吗? TIA
    • @Roland:Oracle 存在 ORA 错误,但还有一行代码验证/审计称为 PLW(不知道它代表什么)。据我了解,默认情况下未启用它。这对于纠正在列/等上使用函数等不良习惯非常有用。
    • 我试图找到一个链接,但我得到的只是 PLW 错误细节:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2013-12-06
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    相关资源
    最近更新 更多