Oracle to_date功能有四分之一的格式
-
25-09-2019 - |
题
我需要找到一些记录中创建范围内的宿舍。例如,我正在寻找的所有记录之间创建的第4季度2008年第1季度2010年。我有这个在我那里-条款:
...and r.record_create_date between to_date('2008 4','YYYY Q')
and to_date('2010 1','YYYY Q')
但Oracle说: ORA-01820: format code cannot appear in date input format
.的 Q
是一个有效期的格式符号,所以我不知道发生了什么事。这是一个有效的方法来找到价值观之间砑季度,或者是有更好的办法?
也很有趣,可能是相关的,如果我执行这个:
select to_date('2009','YYYY') from dual;
值显示在我IDE 2009-08-01
.我期望的 2009-08-04
, ,由于 今天 是 2010-08-04
.
这样的:
select to_date('2009 1','YYYY Q') from dual;
当然,失败。
(Oracle10g)
解决方案
Oracle说: ORA-01820: format code cannot appear in date input format
.的 Q
是一个有效期的格式符号,所以我不知道发生了什么事。
见第二列表2.15在 http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34948.不是所有的格式要素时,可允许转换的日期、时间戳,等等。
我建议反对使用之间的日期范围内的检查。人们常常会错过值结束日期包括在内。所以我会翻译:
and r.record_create_date between to_date('2008 4','YYYY Q')
and to_date('2010 1','YYYY Q')
要
and to_date('2008-10-01', 'YYYY-MM-DD') <= r.record_create_date
and record_create_date < to_date('2010-04-01', 'YYYY-MM-DD') -- < beginning of 2Q2010.
其他提示
有人问同样的问题上OTN:的http://论坛.oracle.com /论坛/ thread.jspa?线程ID = 1081398&TSTART = 255
这个问题的关键是,你可以的不的在TO_DATE函数指定 “Q”。
既然你已经指定日期的一部分,为什么不提供的全部的日期?心灵太那个to_date('2010 1','YYYY Q')
会给你2010年1月1日,当你真的想2010年3月31日......在第二至午夜。
由于到几个月四分之三之间的关系是一对许多人来说,它是没有意义的做TO_DATE(“2008 1”,“YYYY Q”);什么日期应退还?第一季度,该季度末,...? (在另一方面,一数据转换到四分之一 - 就像TO_CHAR(SYSDATE,“YYYY Q”)是有意义的,因为特定的日期仅在四分之一存在)
所以,如果你想查询会找出两个季度之间下降的日期,你将不得不“rolll你自己”(显式声明一季度开始/结束的日期。)
作为一个方面说明,万一有人正在考虑不使用TO_DATE请不要使用类似的事情:WHERE DATE_VALUE“之间的日期字符串1”和“日期字符串2”,不TO_DATE功能。它假定一个默认日期格式和在某些情况下可完全避免潜在有用的索引。
下面是一个例子,其中相同的查询可以有不同的结果。
select sysdate from dual where sysdate between '1-Jan-10' and '31-Dec-10';
SYSDATE
---------
04-AUG-10
SQL> alter session set nls_date_format = 'YYYY-MM-DD';
Session altered.
SQL> select * from dual where sysdate between '1-Jan-10' and '31-Dec-10';
no rows selected
(注意的是,在第二个实例返回错误。这只是假设年01月10,0001日和12月10日,0031。)
我认为最好的办法是只输入季度的开始日期和季度末日期,甚至没有与TO_DATE打扰。我想,如果你使用
between '1-Jan-10' and '31-Dec-10'
例如,那你就不要(在Oracle我相信)需要TO_DATE,它是不是比季度数打字更加困难
要在甲骨文计算季度的第一天,从年和季度季度的最后一天: 我使用的事实
<强> START_MONTH = -2 + 3 *季度强>
<强> LAST_MONTH = 3 *季度强>
variable v_year number
variable v_quarter number
exec :v_year :=2017
exec :v_quarter:=4
select :v_year as year,
:v_quarter as quarter,
to_date(:v_year||to_char(-2+3*:v_quarter,'fm00'),'yyyymm') as quarter_start,
last_day(to_date(:v_year||to_char(3*:v_quarter,'fm00')||'01 23:59:59','yyyymmdd hh24:mi:ss')) as quarter_end
from dual a;
YEAR|QUARTER|QUARTER_START |QUARTER_END
2017| 4|2017-10-01 00:00:00|2017-12-31 23:59:59