我试图在oracle SQL中使用Year-Week格式仅返回一系列Year-Weeks的结果.
这就是我正在尝试的
SELECT * FROM widsys.train trn WHERE trn.WID_DATE>=TO_DATE('2008-13', 'YYYY-IW') AND trn.WID_DATE<=TO_DATE('2008-15', 'YYYY-IW') ORDER BY trn.wid_date
Run Code Online (Sandbox Code Playgroud)
但它发出了这个错误.
ORA-01820:格式代码不能以日期输入格式出现,但在ORA上失败
关于我可以使用什么的任何建议?
谢天谢地,
托马斯
你可以翻转它并做一个字符串比较.
SELECT *
FROM widsys.train trn
WHERE to_char(trn.WID_DATE, 'YYYY-IW') ='2008-13'
ORDER BY trn.wid_date;
Run Code Online (Sandbox Code Playgroud)
我认为to_date()不适用于IW是有道理的,因为本周的开始有些含糊不清 - 一些语言环境在周日开始,其他星期一开始等等.生成截断的一周,不像截断的那样因此,日,月或年将很难.
编辑:
我同意自然类型应该足够了,但你让我思考.您如何比较给定日期和格式化的YYYY-IW字符串?我捅了一下.这种尝试可以构建为一个采用日期和YYYY-IW格式化varchar的函数,但是您需要替换硬编码字符串和to_date()函数调用,并执行一些清理.
如果传入的日期在year/weekofyear之前,则返回-1;如果日期在指定的weekofyear内,则返回0,如果传入日期在yearofyear之后,则返回0.它适用于ISO周一年,"IW"格式令牌也是如此.
select (case
when input.day < a.startofweek then -1
when input.day < a.startofweek+7 then 0
else 1 end)
from
(select
-- //first get the iso offset for jan 1, this could be removed if you didn't want iso
(select (max(to_number(to_char(to_date('2008','YYYY') + level,'DDD'))))
from dual
where to_number(to_char(to_date('2008','YYYY') + level,'IW'))
<2 connect by level <= 6) -6
+
-- //next get the days in the year to the month in question
(select ((to_number(substr('2008-13', 6,2))-1)*7) from dual) startofweek
from dual) a,
-- //this is generating a test date
(select to_number(to_char(to_date('2008-07-19', 'YYYYMMDD'), 'DDD')) day
from dual) input,
dual
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1084 次 |
最近记录: |