簡體   English   中英

在 Azure 中將 bigint 時間戳/TIMESTAMP_MICROS 轉換為 datetime2 SQL 服務器不起作用 - 錯誤算術溢出將表達式轉換為 int

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM