2017-08-18 3 views
0

JSONドキュメント(私のPythonクライアントでjson.dumps(payload, default=json_util.default))で作成)をmy dbに挿入したいとします。私はSQL Server(Azure)で次の手順を実行します。SQL ServerでOPENJSONを使用してBSONの日付(Unixエポック)を解析する方法

CREATE PROCEDURE InsertReading(@reading nvarchar(max)) 
AS BEGIN 
insert into Readings(IdMongo, Value, Name, Date) 
SELECT _id, value, name, date 
FROM OPENJSON (@reading) 
WITH (_id nvarchar(50), 
     value float, 
     date datetime, 
     name nvarchar(50)) 
END 

それは(私が持っている文書ではない - テストのみ)私はこのようなデータとそれを実行すると正常に動作します:

EXEC InsertReading '{ 
"value" : 21.625, 
"name" : "myname", 
"date" : "2016-03-30T07:38:27.102Z" 
}' 

しかし、それは

EXEC InsertReading '{"date": {"$date": 1503074335547}, "value": 23.5, "name": "myname"}' 

エラー(日付で失敗変換は失敗し、nullを返します)。

Cannot insert the value NULL into column 'Date', table 'db.dbo.Readings'; column does not allow nulls. INSERT fails. 

JSONを正しく挿入するにはどうすればいいですか?クライアントの日付形式を変更することなく(mongoとSQLに同時に送信しています)。

答えて

1

これは楽しいことではありません。 SQL Serverはこの形式をサポートしていないため、手動で日付を構成する必要があります。

SELECT _id, [value], [name], 
    COALESCE(
     [date], 
     DATEADD(MILLISECOND, [dateMillis] % 1000, 
      DATEADD(SECOND, [dateMillis]/1000, '19700101')) 
    ) 
FROM OPENJSON (@reading) 
WITH (_id nvarchar(50), 
     [value] float, 
     [date] datetime, 
     [dateMillis] bigint '$.date."$date"', 
     [name] nvarchar(50)) 

これは、両方のフォーマット(日付/時刻リテラルとのミリ秒単位のオフセット)を渡すことができます。

+0

これは問題なく動作します。 'datetime'の代わりに' datetime2'を使って、 '2017-08-19T15:42:46.5065156Z'のような精度の高い日付を挿入するだけでした – savageBum

関連する問題