2

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

しかし、このエラーが発生します。

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() 関数呼び出しを置き換えて、クリーンアップを実行する必要があります。
渡された日付が year/weekofyear より前の場合は -1 を返し、日付が指定された weekofyear 内の場合は 0 を返し、後の場合は 1 を返します。「IW」形式のトークンと同様に、ISO の週で機能します。

 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-8」ではなく「2009-08」。しかし、「IW」形式はこのパディングを行います。

于 2009-06-24T01:55:50.360 に答える
-1

私は自分のドメインのローカルな理解に一致するように、毎年の週の表を作成することを好みますが、それは私だけです。

于 2009-06-24T03:00:25.657 に答える