最初は、date()
のような行単位の機能を統合しません。
select case when podate is null
then date('12/31/99')
else date (substr (podate,1,2) || char ('/') ||
substr (podate,3,2) || char ('/') ||
substr (podate,5,2)
end
:、コードは次のようになり
---------
MYDATE
----------
2009-01-01
2009-01-02
2009-01-03
2000-01-01
DSNE610I NUMBER OF ROWS DISPLAYED IS 4
をお使いの場合:
create table a (podate varchar(8));
insert into a (podate) values ('20090101');
insert into a (podate) values ('20090102');
insert into a (podate) values ('20090103');
insert into a (podate) values (null);
commit;
select
case when podate is null
then date('2000-01-01')
else date(substr(podate,1,4) || '-' ||
substr(podate,5,2) || '-' ||
substr(podate,7,2))
end as mydate
from a;
drop table a;
commit;
出力:次の例のようにNULLのため、実際のフィールドをテストする方がいいでしょう
私のDB/2は米国の日付形式用に設定されていないため、特定のケースをテストしていません。それはまた、他にも目を引くものです。これは、米国の日付形式を使用しないプラットフォームではうまく動作しない可能性があります。
理想的には、日付は文字列ではなく日付としてデータベースに格納するのが理想です。つまり、変換コストはになります。データがテーブルに入るとになると、何百万回も出力されません。
select case when podate is null
then date('12/31/99')
else podate
end
または、より良いあなたが本当の日付としてそのセンチネル日を持っているつもりはありませんしている場合、すべてでNULL
秒を格納しません。そして、あなたのコードは、簡単かつ速くなります。代わりに、彼らはテーブルに行き、使用などdate('12/31/99')
に変換:
select podate
をそれは(あなたが非NULLセンチネルに慣れ仮定して)それよりもはるかに簡単またはより高速取得していません。
PODATE列の種類は? –
podate列は、従来の列で作成された数値フィールドです。 –