2

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

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

谢邀,

托马斯

4

3 回答 3

5

您可以翻转它并进行字符串比较。

 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
于 2009-06-24T01:55:59.657 回答
0

怎么样

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”格式会进行这种填充。

于 2009-06-24T01:55:50.360 回答
-1

我更喜欢为每年创建一个与我的领域本地理解相匹配的表,但仅此而已。

于 2009-06-24T03:00:25.657 回答