webdevqa.jp.net

3桁より長い10進時間でDateTimeを変換しますか?

CSVからMSSQL 2008Serverにデータをインポートしようとしています。 PowerShellのInvoke-SQLと、_BULK INSERT_を利用するSQLスクリプトを使用しています。

CSVフィールドはVarCharsとしてインポートされ、データ型を指定しようとしています。

CSVで提供されるデータ(私は制御できません)では、一部の日時フィールドに次の形式の日付/時刻があります。

_2012-03-15 15:10:08.920000000_

通常、私はALTERを使用し、SQLに変換させますが、通常は機能します...例:

_ALTER TABLE [dbo].[ImportData] ALTER COLUMN [PlanSetupDate] datetime null;_

ただし、上記のようにDateTimeのいずれかにヒットすると、次のエラーメッセージが表示されて失敗します。

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

次に、SQLのConvertを試しました。

Select Convert(datetime, '2012-03-15 15:10:08.920000000')

しかし、ALTERを使用した場合と同じエラーメッセージが表示されます。

余分な小数点以下の桁数を切り取った場合(3以下のまま)、変換は期待どおりに機能します。例:

_2012-03-15 15:10:08.920_

列内の他の日時のほとんどは_2010-01-05 00:00:00_のような従来の形式であるため、変換する前にフィールドの最後のX文字を切り捨てることはできませんjust

私はそれを維持したいのですが、時間の部分はそれほど重要ではなく、小数点以下は間違いなく重要ではありません。したがって、変換のソリューションで小数で切り捨てる必要がある場合は、それで問題ありません。 :)

PowerShellなどを介してSQLにインポートする前にCSVをいつでも変更できますが、可能であれば、SQL内でデータのすべての処理を実行したいと思います。

では、SQLクエリを使用してこの問題のある日時形式を変換する方法はありますか?

3

DATETIME2はあなたが探しているSQLデータ型です。小数点以下7桁までの秒精度が必要です。 TechNetは、さまざまなタイプを比較する例とともに、完全な情報を提供します ここ

以下に、該当するすべてのタイプに関する基本事項を示します。

SELECT 
     CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time' 
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date' 
    ,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS 'smalldatetime' 
    ,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime' 
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS 'datetime2'
    ,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS 'datetimeoffset';

結果を生成します:

Data type       Output
time            12:35:29. 1234567
date            2007-05-08
smalldatetime   2007-05-08 12:35:00
datetime        2007-05-08 12:35:29.123
datetime2       2007-05-08 12:35:29.1234567
datetimeoffset  2007-05-08 12:35:29.1234567 +12:15

上記のクエリと結果は、上記のTechNetページから直接取得したものです。

N.B.私believethat DATETIME2はSQL2008で最初に登場しました。

2
BillP3rd