【问题标题】:Select from table by knowing only date without time (ORACLE)通过只知道没有时间的日期从表中选择 (ORACLE)
【发布时间】:2011-01-24 21:05:48
【问题描述】:

我正在尝试通过知道列中的日期包含日期和时间来从表中检索记录。

假设我有一个名为t1 的表,它分别只包含两列namedate

日期列中存储的数据像这样8/3/2010 12:34:20 PM

例如,我想通过这个查询来检索这条记录(注意我没有放时间):

Select * From t1 Where date="8/3/2010"

这个查询什么也没给我!

如果只知道date 而没有时间,如何检索date

【问题讨论】:

    标签: sql oracle date


    【解决方案1】:

    DATE 是 Oracle 中的保留关键字,所以我改用列名 your_date

    如果您在your_date 上有索引,我会使用

    WHERE your_date >= TO_DATE('2010-08-03', 'YYYY-MM-DD')
      AND your_date <  TO_DATE('2010-08-04', 'YYYY-MM-DD')
    

    BETWEEN:

    WHERE your_date BETWEEN TO_DATE('2010-08-03', 'YYYY-MM-DD')
                        AND TO_DATE('2010-08-03 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
    

    如果没有索引或者没有太多记录

    WHERE TRUNC(your_date) = TO_DATE('2010-08-03', 'YYYY-MM-DD')
    

    应该足够了。不带参数的TRUNC 会从DATE 中删除小时、分钟和秒。


    如果性能真的很重要,请考虑在该列上添加Function Based Index

    CREATE INDEX trunc_date_idx ON t1(TRUNC(your_date));
    

    【讨论】:

    • @Abdulrhman - 你应该接受对你有用的答案!
    • trunk() 像魅力一样工作,像巧克力一样甜美!我应该早点看你的帖子。
    • @SergiyKolesnikov:我不明白这是怎么发生的,请查看一个查询而不是另一个查询返回的行,并尝试调查会发生什么。顺便说一句,没有&lt;=,只有&lt;
    • TRUNK + TO_DATE 有效!也更容易,因为它不太好写那些 YYYYMMDDHHMMSS 格式
    • @ACV:它与我的测试一起使用,但它取决于您的表统计信息以及优化器在给定范围内期望的行百分比。
    【解决方案2】:

    将您的日期列转换为正确的格式并进行比较:

    SELECT * From my_table WHERE to_char(my_table.my_date_col,'MM/dd/yyyy') = '8/3/2010'
    

    这部分

    to_char(my_table.my_date_col,'MM/dd/yyyy')
    

    将产生字符串'8/3/2010'

    【讨论】:

    • 必须小心这种方法。相反,当您需要日期范围时选择“yyyy/mm/MM”
    【解决方案3】:

    就个人而言,我通常会选择:

    select * 
    from   t1
    where  date between trunc( :somedate )          -- 00:00:00
                and     trunc( :somedate ) + .99999 -- 23:59:59
    

    【讨论】:

      【解决方案4】:

      您可以使用 between 函数获取 2010-08-03 00:00:00:000 AND 2010-08-03 23:59:59:000 之间的所有记录

      【讨论】:

      • BETWEEN 表示&gt;= AND &lt;=,因此您的查询也会返回带有date = 2010-08-04 00:00:00 的行。
      • 不错,已修复。您的回答更加彻底 +1。
      【解决方案5】:

      trunc(my_date,'DD') 只会给您日期,而不是 Oracle 中的时间。

      【讨论】:

        【解决方案6】:

        只需使用这个:

        select * from t1 where to_date(date_column)='8/3/2010'
        

        【讨论】:

        • 你在 oracle 中测试过这个查询吗?
        【解决方案7】:

        试试下面的方法。

        Select * from t1 where date(col_name)="8/3/2010" 
        

        【讨论】:

        • 抱歉,这不适用于 Oracle。给我一个ORA-00936: missing expression
        • 在Oracle中,双引号用于分隔标识符;单引号用于字符串文字。
        • Date() 在 Oracle 中不起作用。例如,SELECT date(sysdate) FROM dual; **ERROR at line 1:ORA-00936: missing expression **
        猜你喜欢
        • 1970-01-01
        • 2015-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-07
        • 2018-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多