【问题标题】:How to retrieve the records based on a date from oracle database如何从oracle数据库中检索基于日期的记录
【发布时间】:2016-11-18 13:23:21
【问题描述】:

我有一个包含日期列的表格。我需要根据它从中获取记录 给定的日期。

目前当我使用查询时:

select * from workingemployee_data where created_date like '20-Jan-2012'

我正在获取那些 created_date 为 2012 年 1 月 20 日的记录

但我想将 10 天前创建的记录获取到给定的 日期(即)2012 年 1 月 20 日。

请在这方面给我建议。

【问题讨论】:

  • 该列created_date的数据类型是什么?
  • like 对 DATE 没有任何意义

标签: sql oracle


【解决方案1】:

这给出了今天和 10 天前之间的所有记录:

SELECT *
FROM workingemployee
WHERE created_date BETWEEN sysdate - INTERVAL '10' DAY
                       AND sysdate

这给出了 10 天前输入的所有记录:

SELECT *
FROM workingemployee
WHERE created_date = sysdate - INTERVAL '10' DAY

如果需要,请将 sysdate 替换为确切的日期。

【讨论】:

  • 很棒,它显示系统日期前 10 天的记录。但是,如果我尝试将 sysdate 替换为我的自定义日期,例如 created_date ='25-DEC-2011' - INTERVAL '10' DAY 它表示日期/时间间隔的数据类型无效。
  • 看来您的created_date 并不是真正的DATE 类型,而是VARCHAR。这真是个坏主意,尤其是对于速度和索引 - 请将其转换为真正的 DATE。但是,您可以使用此表达式作为解决方法:to_date('25-DEC-2012', 'dd-mon-yyyy')
  • created_date 在我的表中属于 DATE 类型
  • 啊,好的。仍然使用to_date('25-DEC-2012', 'dd-mon-yyyy') 之类的东西将您的输入字符串转换为真实日期类型
  • 很高兴它帮助了你!如果您在created_date 上有索引,它应该会运行得非常快
【解决方案2】:
  1. 你为什么使用like而不是=
  2. 假设created_dateDATE 类型,根据NLS_DATE_FORMAT 依赖隐式转换是不好的做法(这是比较日期和字符串时发生的情况)
  3. dd-mon-yyyy 不是一种很好的查询格式,因为它根据 NLS_LANGUAGE 延迟,最好使用 mm 来表示月份数

所以,要么使用@mvp's answer,要么执行以下操作:

SELECT *
FROM workingemployee
WHERE trunc(created_date) = to_date('20-01-2013', 'dd-mm-yyyy') - 10

【讨论】:

  • 不幸的是,这个解决方案不能利用created_date 上可能的索引,因此它将使用全表扫描 - 非常慢,尤其是在表很大的情况下。
  • 这可以通过使用function based indexescreate_date >= to_date('20-01-2013 000000', 'dd-mm-yyyy hh24miss') - 10 and create_date >= to_date('20-01-2013 235959', 'dd-mm-yyyy hh24miss') - 10 来解决
【解决方案3】:

选择 * 来自工作员工 WHERE created_date > sysdate - INTERVAL '10' DAY;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多