web-dev-qa-db-ja.com

DB2で文字列を日付に変換する

私は初めてDB2データベースで作業しています。

DB2の日付を処理しようとしていますが、データはDB2データベースに文字列として保存されます。

この日付文字列を実際の日付に変換します。2011年1月1日から2011年1月26日までのすべてのトランザクションが必要なため、できれば時間を降ろしてください。

だから本質的に、私はこのMS SQLステートメントをDB2マジックに入れたい...

CONVERT(datetime,SETTLEMENTDATE.VALUE,103)

背景として、私は限り

CAST(SETTLEMENTDATE.VALUE, DATE)

そして

DATE(SETTLEMENTDATE.VALUE)

しかし、DB2ウィズキッドの専門知識が必要です。

ありがとう

7
Fenton

あなたの答えに基づいて、私はあなたの列が次のようなフォーマットのデータを持っていると思います:

'DD/MM/YYYY HH:MI:SS'

日/月/年の間の実際の区切り文字は関係ありませんし、年の後に来るものは何もしません。

使用しているDB2のバージョンや、どのプラットフォームで実行されているかは言わないので、Linux、UNIX、またはWindowsであると想定します。

Linux/UNIX/Windows用のほとんどすべての最新バージョンのDB2(8.2以降、場合によっては古いバージョン)でも、TRANSLATE関数を使用してこれを実行できます。

select 
   date(translate('GHIJ-DE-AB',column_with_date,'ABCDEFGHIJ'))
from
   yourtable

このソリューションでは、列の日付の後に何が来るかは関係ありません。

DB2 9.7では、TO_DATE関数も使用できます(OracleのTO_DATEと同様)。

date(to_date(column_with_date,'DD-MM-YYYY HH:MI:SS'))

これには、データがフォーマット文字列と一致する必要があります。見た方がわかりやすいですが、TRANSLATEオプションほど柔軟ではありません。

21
Ian Bjorhovde

古い投稿は知っていますが、それでも貢献したいです
このようなデータ形式がある場合、上記は機能しません
'YYYMMDD'

例えば:

Dt
20151104

だから私は望ましい結果を得るために以下を試しました。

select cast(Left('20151104', 4)||'-'||substring('20151104',5,2)||'-'||substring('20151104', 7,2) as date) from SYSIBM.SYSDUMMY1;

さらに、MS SQLリンクサーバーからDB2にクエリを実行する場合(100行のみを表示する場合)。

    SELECT top 100 * from OPENQUERY([Linked_Server_Name],
    'select cast(Left(''20151104'', 4)||''-''||substring(''20151104'',5,2)||''-''||substring(''20151104'', 7,2) as date) AS Dt 
    FROM SYSIBM.SYSDUMMY1')

上記のクエリ後の結果:

Dt
2015-11-04

これが他の人に役立つことを願っています。

6
Denn

さて、少しハックのようです。部分文字列を使用して動作するようにしたので、日付(時間ではなく)を含む文字列の一部のみがDATE関数に渡されます...

DATE(substr(SETTLEMENTDATE.VALUE,7,4)||'-'|| substr(SETTLEMENTDATE.VALUE,4,2)||'-'|| substr(SETTLEMENTDATE.VALUE,1,2))

私はこれよりも良い答えを受け入れます!

0
Fenton

Format関数では、timestamp_format関数を使用できます。例:形式がYYYYMMDDの場合、次のようにできます。

select TIMESTAMP_FORMAT(yourcolumnchar, 'YYYYMMDD') as YouTimeStamp 
from yourtable

あなたはそれから適応して、見つけられる要素でフォーマットすることができます ここ

0
Esperento57