7

javascriptの日付をSQLの日付に変換するSQLがいくつかあります。これはうまく機能します。ただし、大きすぎて例外を引き起こしているデータをいくつか見つけました。

式をデータ型intに変換する算術オーバーフローエラー

問題のSQLは次のとおりです。

  DATEADD(MILLISECOND, cast(569337307200000 as bigint) % 1000, DATEADD(SECOND, cast(569337307200000 as bigint) / 1000, '19700101'))

これをSQLServer2008で実行しています。

4

5 に答える 5

10

問題のある問題DATEADDを2つのステップで実行します。粗い時間単位(秒、分、時間など)から始めて、残りの部分はきめの細かい単位に戻します。

実際のカレンダー計算が必要になるため、週や月のレベルに進むことは避けてください。システムでそれを処理することをお勧めします。

以下の例では、(おそらく)大きな電流持続時間をミリ秒単位で指定して開始時間を計算する必要があります。

-- large durations can overflow the integer argument needed for DATEADD

-- so do as two steps subtracting minutes (60000ms) and then remaining milliseconds.

DATEADD(ms, -large_duration_ms%60000, DATEADD(minute, -large_duration_ms/60000, GETDATE()))
于 2015-05-15T06:16:23.120 に答える
6

整数のオーバーフローの問題を回避する1つの方法は、microtimeUNIXタイムスタンプからより新しい日付を減算することでした。

DATEADD(s, (CreationTimeStamp/1000-1384128000), '2013-11-11') AS CreateDate,

OPの問題は、日付列の最大値をオーバーフローするため、修正されません。

于 2013-11-14T14:12:02.623 に答える
3

MSDNによると、DATEADD (datepart , number , date )

numberは、日付の日付部分に追加されるintに解決できる式です。ユーザー定義変数は有効です。小数部の値を指定すると、小数部は切り捨てられ、丸められません。

また、数値を整数で指定した場合でも、日付と日付の部分によっては、SQLServer2008の日付の最大範囲である31-12-9999をオーバーフローする可能性があることに注意してください。

数値は整数である必要があります。これがテストデモです

于 2013-02-22T18:22:12.403 に答える
1

私は同じ問題を抱えていて、mssqlの日時範囲を満たしたいと思っていました

  • 最小日時:1753-01-01 00:00:00.000(-6847804800)
  • 最大日時:9999-12-31 23:59:59.997(253402300799)

これを達成するために私が見つけた唯一の解決策は、int範囲値でDATEADDを使用するようにループすることでした。

したがって、この回答に基づいて:https ://stackoverflow.com/a/2904294/687490

CREATE FUNCTION dbo.fn_ConvertToBigDateTime (@Datetime BIGINT)
RETURNS DATETIME
AS
BEGIN
    DECLARE @result datetime = Convert(datetime, '01/01/1970');

    DECLARE @LocalTimeOffset BIGINT
           ,@AdjustedLocalDatetime BIGINT
           ,@MinIntValue INT
           ,@MaxIntValue INT
           ,@RemainingSeconds BIGINT;

    -- define int limit
    SET @MinIntValue = -2147483648;
    SET @MaxIntValue = 2147483647;

    -- compute the datetime with the offset
    SET @LocalTimeOffset = DATEDIFF(second,GETDATE(),GETUTCDATE())
    SET @AdjustedLocalDatetime = @Datetime - @LocalTimeOffset

    -- going to the future
    WHILE(@AdjustedLocalDatetime>@MaxIntValue)
    BEGIN
        SET @AdjustedLocalDatetime = @AdjustedLocalDatetime - @MaxIntValue;
        SELECT @result = Convert(datetime, dateadd(ss, @MaxIntValue,@result));
    END

    -- going back in the past
    WHILE(@AdjustedLocalDatetime<@MinIntValue)
    BEGIN
        SET @AdjustedLocalDatetime = @AdjustedLocalDatetime - @MinIntValue;
        SELECT @result = Convert(datetime, dateadd(ss, @MinIntValue,@result));
    END

    RETURN (SELECT DATEADD(second,@AdjustedLocalDatetime, @result))
END;

次に、次のコマンドで関数をテストできます。

select dbo.fn_ConvertToBigDateTime(-6847804800) as 'min datetime', 
dbo.fn_ConvertToBigDateTime(253402300799) as 'max datetime'

それがお役に立てば幸いです。

于 2018-11-06T18:35:12.407 に答える
-2

私もこの問題に直面しました。私のsqlステートメントでは、日時の値がnullのときにエラーが発生しました。

私の解決策は、「CASEWhen」を使用して日時の値がnullかどうかを確認することです。nullでない場合にのみ算術演算を実行し、問題は解決しました。

于 2018-10-03T03:10:38.943 に答える