0

私はサードパーティのデータベースを使用しています。このデータベースは、(何らかの理由で)内部に日付をyyyymmたとえば201212の形式で格納Dec 2012しますINT

これをSQLServerタイプに変換する簡単な方法はありますDateTimeか?

上記を手動で長さ6のcharseqに変換し、これを「01」と連結して、次のように特定の月の開始を取得しようとしました。

(CONVERT(char(6), Period) + '01')`

datetime次に、これを変換でラップします。

CONVERT(datetime, (CONVERT(char(6), Period) + '01'))

しかし、これはスローするようです。

文字列から日付や時刻を変換するときに変換に失敗しました

誰かが私が間違っていることに光を当てることができますか?

ありがとう!:)

4

7 に答える 7

1

これはそれを行う1つの方法です:

Declare @val as int = 20121231;
select DATEADD (YEAR,@val/10000-1900,DATEADD(MONTH,(@val%10000)/100-1,DATEADD(DAY,@val%100-1,0 )))

これは別です:

Declare @val as int = 20121231;
    Cast(Cast(@val as char(8)) as date)

1つ目は、地域設定の依存関係がないため、適切です。2つ目は短いので良いです。

于 2012-12-31T14:35:27.140 に答える
1

正しいパラメータを使用する必要があります。これがmsdnチャートですhttp://msdn.microsoft.com/en-us/library/ms187928.aspx

あなたの場合、「01」を追加してこれを使用する必要があると思います

declare @val VARCHAR(8)

SET @val = '201212'

set @val = @val + '01'

print CONVERT(DATETIME, @val, 12)

12はISO形式であり、yymmddまたはyyyymmddのいずれかを取ります

于 2012-12-31T14:38:23.653 に答える
0

私は以下が非常にうまく機能することを発見しました。日付のINTがYYYYMM形式であると想定します。最初に100を掛け、次に1を足します(これにより、DDが01のINTになります)。これで、YYYYMMの代わりにYYYYMMDDが得られます。次に、DATETIMEにキャストする前に、CHAR(8)にキャストします。それがあなたのために働くことを願っています。

DECLARE @SourceDT   INT = 201212
SELECT CAST( CAST((@SourceDT * 100) + 1 AS CHAR(8)) AS DATETIME)
于 2012-12-31T14:50:56.850 に答える
0

以下のように使用できます。

Select CAST( CAST(datepart(year,getdate()) AS VARCHAR(4))+ CAST (datepart(MONTH,getdate()) as VARCHAR(2)) AS INT) as YYYYMM
于 2012-12-31T14:44:59.093 に答える
0

これでうまくいくはずです:

DECLARE @Period INTEGER = 201212 
SELECT  CAST( CAST( @Period * 100 + 1 AS CHAR(8) ) AS DATETIME )
于 2012-12-31T14:35:14.963 に答える
0

yyyy-mm-dd整数をスタイル文字列に変換します。

select  convert(datetime, 
            left(cast(dt as char(6)),4) + '-' +
            right(cast(dt as char(6)),2) + '-01',
            121) -- 121 = ODBC = yyyy-mm-dd hh:mi:ss.mmm (24h)
from    YourTable

SQLFiddleでの実例。

于 2012-12-31T14:38:33.593 に答える
0

文字列をできるだけ避けて、いくつかの簡単な数学でそれを行うことができます:

declare @Start int
set @Start = 201212

select DATEADD(month,((@Start/100)-1970)*12 + (@Start%100-1),'19700101')

そうは言っても、それYYYYMMDDは明確な形式なので、あなたが最初に投稿したものが機能することを期待していました。


値の範囲を含む可能性のあるテーブルからこれらの値を選択し、そのうちの一部のみがこれらの値でありWHERE、変換が行われる前に無効な値を除外する句に依存している場合は、運が悪いです--SQL Serverには、操作を移動するという厄介な習慣があり、フィルターと変換を好きな順序で適用できます。

この場合は、フィルタリング手順(無効なPeriod値を除外するため)を、テーブル変数または一時テーブルに入力する別のクエリに移動してから、別のクエリでそれらの値の変換を実行します。

于 2012-12-31T14:40:17.527 に答える