[英]Converting a bigint timestamp/TIMESTAMP_MICROS to datetime2 in Azure SQL Server doesn't work - error Arithmetic overflow converting expression to int
我正在將紐約旅行數據 ( https://www.nyc.gov/site/tlc/about/tlc-trip-record-data.page ) 從鑲木地板文件加載到 Azure SQL 數據庫。 日期的格式為 TIMESTAMP_MICROS,似乎是 bigint 的時間戳。 我可以將數據加載到 SQL 服務器。
現在我想添加一個持久計算列以將時間戳轉換為日期時間。 對於 TOP 1000 中的正常 SELECT,以下查詢顯示正確的格式:
SELECT TOP 1000
CONVERT
(
datetime2,
DATEADD(S,[tpep_dropoff_datetime] / 1000000, CONVERT(datetime,'1970-01-01',120))
)
AS [pickup_datetime_]
FROM [dbo].[NYTaxi]
我嘗試使用以下查詢添加計算列:
ALTER TABLE [dbo].[NYTaxi]
ADD [pickup_datetime] AS
CONVERT
(
datetime2,
DATEADD(S, CAST(CAST([tpep_pickup_datetime] AS BIGINT) / CAST( 1000000 AS INT) AS INT), CONVERT(datetime,'1970-01-01',120))
)
PERSISTED;
但我總是收到以下錯誤:
消息 8115,16 級,State 2,第 8 行
將表達式轉換為數據類型 int 時出現算術溢出錯誤。
有誰知道為什么會發生錯誤? 我該如何解決? 如果日期格式錯誤,我也很樂意返回 NULL 值。
您的代碼目前看起來不錯。
DECLARE @tpep_pickup_datetime varchar(20) = '2147483647000000'
SELECT DATEADD(S, CAST(CAST(@tpep_pickup_datetime AS BIGINT) / CAST( 1000000 AS INT) AS INT), CONVERT(datetime,'1970-01-01',120))
返回2038-01-19 03:14:07.000
。
再高一點,你就會遇到“ 2038 年問題”,但因為tpep_dropoff_datetime
是
該數據集適用於紐約市的出租車,而不是時間機器,所以你現在應該沒問題。
我也很樂意返回 NULL 值。
您可以使用
DATEADD(SECOND, TRY_CAST(CAST(tpep_pickup_datetime AS BIGINT) / 1000000 AS INT), '19700101')
將這些大量異常值無錯誤地轉換為NULL
並使用此表達式來識別行以更詳細地查看(只是垃圾數據或其他發生了什么?)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.