【问题标题】:Oracle find dates same day different monthsoracle查找同一天不同月份的日期
【发布时间】:2013-06-18 22:27:06
【问题描述】:

我有一个问题,我想从一个表中找到与给定日期的日期和年份相匹配的所有记录,例如在所有月份中

给定日期(mm/dd/yyyy):

'12/24/2010'

返回所有带日期的记录:

'12/24/2010'
'11/24/2010'
'10/24/2010'
'09/24/2010'
'08/24/2010'
'07/24/2010'
'06/24/2010'
'05/24/2010'
'04/24/2010'
'03/24/2010'
'02/24/2010'
'01/24/2010'

有没有办法在一个查询中做到这一点? 我想在一个函数中实现它,但不想使用循环(只是为了速度)。 任何帮助将不胜感激! :)

【问题讨论】:

  • 什么是带日期的字段类型? DATEVARCHAR2?

标签: oracle function date loops range


【解决方案1】:

假设您的列都定义为DATE,从功能上讲,您当然可以这样做

SELECT *
  FROM my_table
 WHERE to_char( date_column, 'DD-YYYY' ) = to_char( date '2010-12-24', 'DD-YYYY' )

您可能会在 to_char( date_column, 'DD-YYYY' ) 上创建一个基于函数的索引,以提高查询效率。

【讨论】:

  • 它就像一个魅力!谢谢,现在我想问一下,我找到了这种方法: select * from table where to_char(date_column,'yyyy/mm/dd') like '2010/%/24';哪一个在记录很多时表现最好?
  • @E.Diaz - 假设您在 date_column 表达式上创建了一个基于函数的索引,并且两个查询都使用了该索引,我希望性能非常相似。但是我发布的等式谓词通常会使优化器更容易获得正确的基数估计,以便生成最佳计划。 LIKE 可能需要更多 CPU,但如果您谈论的是大量数据,I/O 应该是瓶颈,因此 CPU 差异不太重要。
  • 不快!如果数据很大,是不是很慢??
  • @Gank 如果你有很多数据,你肯定想创建基于函数的索引
【解决方案2】:

试试

SELECT date_column FROM some_table 
WHERE 
TO_DATE(date_column, 'MM') = TO_DATE(given_date, 'MM') 
AND 
TO_DATE(date_column, 'YYYY')) = TO_DATE(given_date, 'YYYY')

given_date 是您的“2010 年 12 月 24 日”。

【讨论】:

  • 试过了,它给了我 ORA-01830: date format picture ends before conversion整个输入字符串错误... :(
  • 您不能在DATE 上致电to_date。嗯,你可以。它只是强制 Oracle 首先使用会话的NLS_DATE_FORMATDATE 隐式转换为VARCHAR2。但是无论您将NLS_DATE_FORMAT 设置为什么,TO_DATE 调用中的一个或两个都将失败,因为NLS_DATE_FORMAT 不能同时为MMYYYY。并且将NLS_DATE_FORMAT 设置为这些值中的任何一个都会有很高的风险导致其他问题。
  • 试试select date_column from some_table where TO_CHAR(TO_DATE(some_date, 'MM/DD/YYYY'), 'MM') = TO_CHAR(TO_DATE(given_date, 'MM/DD/YYYY'), 'MM') AND TO_CHAR(TO_DATE(some_date, 'MM/DD/YYYY'), 'YYYY') = TO_CHAR(TO_DATE(given_date, 'MM/DD/YYYY'), 'YYYY')
猜你喜欢
  • 2021-10-26
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多