2016-03-22 18 views
2

ExcelからSQL Serverにデータをインポートする際に問題が発生します。宛先表にインポートされるdatetimeの値は、Excelソースファイルのdatetimeの値とは異なります。SQL Server 2012にインポートするとExcelの日時の値が予期せず変更される

フォーマットの有無にかかわらず、値は常にExcelの実際の時間よりも0.003ミリ秒少なくなります。これにより、GROUP BY時間にしようとすると、午前1時にマークするべき値が午前12時にマークされます。

正確な値を確認するには、サンプルクエリ&の結果に注目してください。

誰かが私にこれがなぜ起こっているのか、私の期待される結果を得る方法を教えてもらえれば、それは非常に感謝しています。

これを解決するには、追加の手順を踏まずに解決したいと思います。 Excelで(ノーステージング表は、してください)

SELECT   
    Timestamp, 
    CAST(Timestamp AS DATE) Date,    
    CAST(Timestamp AS DATETIME) Datetime, 
    CAST(Timestamp AS DATETIME2) Datetime2, 
    CAST(Timestamp AS TIME) Time 
FROM 
    OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0 Xml;HDR=Yes; 
       Database=\\server\share\160322.xlsx;', 
       'SELECT * FROM [160322$]') 

/* Query Results (ALL WRONG):  
Timestamp : 2016-03-22 00:59:59.997  -- Imported Value without formatting 

Date  : 2016-03-22     -- Formatted Values 
Datetime : 2016-03-22 00:59:59.997 
Datetime2 : 2016-03-22 00:59:59.9970000 
Time  : 00:59:59.9970000 
*/ 

値:

3/22/2016 12:15:00 AM 

値SQL Serverテーブル内:

2016-03-22 00:14:59.997 

予想されるSQL Serverの値:

2016-03-22 00:15:00.000 

値Excelの場合:

3/22/2016 01:00:00 AM 

SQL Serverテーブルの値:

2016-03-22 00:59:59.997 

予想されるSQL Serverの値:

2016-03-22 01:00:00.000 
+0

その問題を解決する必要があり、marc_s、ありがとうございました。 DATETIME2(3)は依然として.997ミリ秒を返しましたが、DATETIME2(1)とDATETIME2(2)の両方が期待値を返しました! – Archias

答えて

1

は、SQL Server内のDATETIMEデータ型は、0.003秒の精度がある - 3.33ミリ秒 - それはです(here on MSDNおよびここではblog postを参照)。

あなただけ.000.003.007.010.013などのような値を取得 - DATETIMEはミリ秒までの値をサポートしていません。 (OPENROWSETを使用してExcelからのインポートが何とかすることを狂わせる場合を除き)

しかしDATETIME2(3)を使用すると、

関連する問題