Вы можете перевернуть его и выполнить сравнение строк.
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? Я нанес удар. Эту попытку можно превратить в функцию, которая принимает дату и тип varchar в формате YYYY-IW, но вам потребуется заменить жестко закодированные строки и вызовы функции to_date(), а также выполнить некоторую очистку.
Она возвращает a -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
person
akf
schedule
24.06.2009