SQL将从2008年第13周返回结果(未分组)

2 sql oracle date week-number

我试图在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上失败

关于我可以使用什么的任何建议?

谢天谢地,

托马斯

akf*_*akf 5

你可以翻转它并做一个字符串比较.

 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)