0

テーブルの1つでは、日付列の値は次のようになります

 date
25052008112228
26052008062717

テーブル名はトランザクションです

以下のクエリを使用してみましたが、スローエラーが発生しました

select * from transaction where date between '2012-01-06' and '2012-06-30'

select * from transaction where date between '2012/01/06' and '2012/06/30'

解決策を教えてください。

4

2 に答える 2

0

-- ASP タイムスタンプ

 select  * from [transaction] where 
    cast(SUBSTRING([date],5,4) + '-' + SUBSTRING([date],3,2) + '-' +
    SUBSTRING([date],1,2) + ' ' + SUBSTRING([date],9,2) + 
    ':' + SUBSTRING([date],11,2) + ':' +
    SUBSTRING([date],13,2) as datetime)
between '2008-05-26' and  '2012-01-06'

-- UNIX エポック時間

 select * from [transaction] where  [date] 
 between DATEDIFF( SECOND, '01-01-1970 00:00:00', '2012-01-06' ) 
 and DATEDIFF( SECOND, '01-01-1970 00:00:00', '2012-06-30')
于 2012-07-12T10:09:47.217 に答える
0

問題は、[日付] 列に、適切な値に自動的に変換される形式の日付が含まれていないことです。サポートされている形式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'

(最終クエリの日付リテラルも安全な形式に変更したことに注意してください)

于 2012-07-12T10:30:36.793 に答える