您可以翻转它并进行字符串比较。
SELECT *
FROM widsys.train trn
WHERE to_char(trn.WID_DATE, 'YYYY-IW') ='2008-13'
ORDER BY trn.wid_date;
我认为 to_date() 不适用于 IW 是有道理的,因为一周的开始有点模棱两可 - 一些语言环境从星期天开始一周,其他地方从星期一开始,等等。生成一年中截断的一周,不像截断因此,日、月或年将是困难的。
编辑:
我同意自然排序就足够了,但你让我思考。您将如何比较给定日期和格式化的 YYYY-IW 字符串?我试了一下。可以将这种尝试改造成一个接受日期和 YYYY-IW 格式的 varchar 的函数,但您需要替换硬编码字符串和 to_date() 函数调用,并执行一些清理操作。
如果传入的日期在年份/年份之前,则返回 -1,如果日期在指定的年份之内,则返回 0,如果在之后,则返回 1。它适用于一年中的 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