Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回2008年第13周结果的SQL(未分组)_Sql_Oracle_Date_Week Number - Fatal编程技术网

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

返回2008年第13周结果的SQL(未分组),sql,oracle,date,week-number,Sql,Oracle,Date,Week Number,我尝试在oracle SQL中使用年-周格式,只返回一系列年-周的结果 这就是我要尝试的 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 但它消除了这个错误 ORA-01820:格式代码不能以日期输入格式显示,但在ORA上失败 对我

我尝试在oracle SQL中使用年-周格式,只返回一系列年-周的结果

这就是我要尝试的

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
但它消除了这个错误

ORA-01820:格式代码不能以日期输入格式显示,但在ORA上失败

对我能用什么有什么建议吗

谢谢你

托马斯怎么样

select * from widsys.train trn 
  where to_char(trn.wid_date, 'YYYY-IW') =  ?
  order by trn.wid_date
对于射程

select * from widsys.train trn 
  where to_char(trn.wid_date, 'YYYY-IW') between ? and ?
  order by trn.wid_date
该范围将使用字符串比较,如果较小的数字是零填充的,则可以进行比较:
2009-08而不是2009-8。但是“IW”格式会进行这种填充

您可以将其翻转,然后进行字符串比较

 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

我更喜欢为每年创建一个与我的本地理解相匹配的周表,但那只是我自己。

这很管用!谢谢但我也需要把它变成一个星期的范围,现在我已经编辑了我的问题。我试过>='2008-13',但我认为这不适用于字符串。试一下,字符串的自然顺序应该允许您执行类似于'2008-13'>x>'2008-18'的操作谢谢您的回答!它工作得很好,但当我尝试将其扩展到一个范围时,返回了奇怪的结果。我想>=或范围应该有效。只需确保填充为零:“2009-08”而不是“2009-8”。此表需要每年更新一次,不是吗?是的,但您可以使用自动机制轻松地进行更新,或者只需投入100年的时间-520行与52行的性能差异微不足道。它的另一个优点是,如果使用客户机定义的周数,那么现在就有了一种机制,只需为每个客户机向表中添加一个客户机id即可。