問題は、[日付] 列に、適切な値に自動的に変換される形式の日付が含まれていないことです。サポートされている形式datetime
の値さえ含まれていません。したがって、文字列操作を使用してテキストを細断処理する必要があります。
declare @Transactions table (TDate char(14))
insert into @Transactions (TDate) values
('25052008112228'),
('26052008062717')
select CONVERT(datetime,
SUBSTRING(TDate,5,4) + '-' +
SUBSTRING(TDate,3,2) + '-' +
SUBSTRING(TDate,1,2) + 'T' +
SUBSTRING(TDate,9,2) + ':' +
SUBSTRING(TDate,11,2) + ':' +
SUBSTRING(TDate,13,2))
from
@Transactions
結果:
2008-05-25 11:22:28.000
2008-05-26 06:27:17.000
CONVERT/SUBSTRING
この種の変換を頻繁に実行する必要がある場合は、操作を UDF にラップできます。もちろん、列の定義を変更して真のdatetime
値を格納するのが理想的です。ほとんどすべてのdatetime
問題は、列をテキストとして扱うときに発生します。
(予約語の使用は通常悪い考えであるため、テーブルと列の両方の名前を変更したことに注意してください)
クエリは次のようになります。
;with converted as (
select *,CONVERT(datetime,
SUBSTRING([Date],5,4) + '-' +
SUBSTRING([Date],3,2) + '-' +
SUBSTRING([Date],1,2) + 'T' +
SUBSTRING([Date],9,2) + ':' +
SUBSTRING([Date],11,2) + ':' +
SUBSTRING([Date],13,2)) as GenuineDate
from [Transaction]
)
select * from converted where GenuineDate between '20120106' and '20120630'
(最終クエリの日付リテラルも安全な形式に変更したことに注意してください)