sql >> データベース >  >> RDS >> Sqlserver

SQLServerで夏時間の開始関数と終了関数を作成する方法

    夏時間のスケジュールは国によって異なり、また年々変更される可能性があることを忘れないでください。たとえば、現在の米国のシステムは2007年に発効しました。

    米国の現在のシステムが必要だと仮定すると、特定の年の回答の1つの形式がここにあります。

    SET DATEFIRST 7
    
    DECLARE @year INT = 2013
    DECLARE
        @StartOfMarch DATETIME ,
        @StartOfNovember DATETIME ,
        @DstStart DATETIME ,
        @DstEnd DATETIME
    
    
    
    SET @StartOfMarch = DATEADD(MONTH, 2, DATEADD(YEAR, @year - 1900, 0))
    SET @StartOfNovember = DATEADD(MONTH, 10, DATEADD(YEAR, @year - 1900, 0));
    SET @DstStart = DATEADD(HOUR, 2,
                            DATEADD(day,
                                    ( ( 15 - DATEPART(dw, @StartOfMarch) ) % 7 )
                                    + 7, @StartOfMarch))
    SET @DstEnd = DATEADD(HOUR, 2,
                          DATEADD(day,
                                  ( ( 8 - DATEPART(dw, @StartOfNovember) ) % 7 ),
                                  @StartOfNovember))
    
    
    SELECT
        @DstStart AS DstStartInUS ,
        @DstEnd AS DstEndInUS
    

    または関数として、ただしDateFirstが7に設定されていることを知っておく必要があります。そうしないと、計算がオフになります。

    CREATE FUNCTION GetDstStart ( @Year AS INT )
    RETURNS DATETIME
    AS
        BEGIN
    
            DECLARE
                @StartOfMarch DATETIME ,
                @DstStart DATETIME 
    
            SET @StartOfMarch = DATEADD(MONTH, 2,
                                        DATEADD(YEAR, @year - 1900, 0))
            SET @DstStart = DATEADD(HOUR, 2,
                                    DATEADD(day,
                                            ( ( 15 - DATEPART(dw,
                                                              @StartOfMarch) )
                                              % 7 ) + 7, @StartOfMarch))
            RETURN @DstStart
        END
    
    GO;
    
    
    CREATE FUNCTION GetDstEnd ( @Year AS INT )
    RETURNS DATETIME
    AS
        BEGIN
            DECLARE
                @StartOfNovember DATETIME ,
                @DstEnd DATETIME
    
            SET @StartOfNovember = DATEADD(MONTH, 10,
                                           DATEADD(YEAR, @year - 1900, 0))
            SET @DstEnd = DATEADD(HOUR, 2,
                                  DATEADD(day,
                                          ( ( 8 - DATEPART(dw,
                                                           @StartOfNovember) )
                                            % 7 ), @StartOfNovember))
            RETURN @DstEnd
        END
    


    1. 範囲の緯度/経度座標を検索します

    2. 同じマシンで実行されている複数のMySQLインスタンスを監視する方法-ClusterControlのヒントとコツ

    3. ルックアップテーブルに従ってデータを置き換える必要があります

    4. OracleSqlでの列行転置