2009-12-10 12 views
5

新しいデータが挿入されたときにDateTimeフィールドを変更するために使用できるデータベースレベルの関数(トリガなど)はありますか?問題は、私が統合しようとしているサービスが、すべての時間(この場合、情報が最後に受信された時間)をGMTで送信することです。DateTimeフィールドが更新されたときにそれを変更する方法はありますか?

DBサーバーがある時間帯の時刻を反映するために、これを自動的に変更する必要があります。例えば、私が2:34 PMを送ってもNYCにいる場合は、 dbを午前9:34とします。これは、GMTとサーバーがどこにあっても悪夢のように見える夏時間の違いを考慮する必要があります。助言がありますか?

また、SQL Server 2005を使用しています。

編集:

1つのことを明確にしましょう。この列に入る日付は頻繁に(5分、10分、15分)毎回バッチで取り出されるため、受信した時刻を変更してTimeModifiedフィールドなどを追加するのではなく、変更するだけです。それは実現可能なのでしょうか?

答えて

9

のためにあなたは、新しいレコード

CREATE TABLE dbo.YourTable 
(........, 
    LastModifiedOn DATETIME 
     CONSTRAINT DF_YourTable_LastModifiedOn DEFAULT (GETDATE()) 
) 
を挿入したときに設定されます DateTimeため

  • デフォルト値を作成することができますデフォルト値およびトリガーで

    CREATE TRIGGER trgAfterUpdate 
    ON dbo.YourTable 
    AFTER UPDATE 
    AS BEGIN 
        UPDATE dbo.YourTable 
        SET LastModifiedOn = GETDATE() 
        FROM INSERTED i 
        WHERE i.Table1ID = YourTable.Table1ID 
    END 
    

あなたの行を更新した時はいつでも、自分の日時フィールドLastModifiedOnは常にあるべき新しい値にDateTimeフィールドを設定しますUPDATE TRIGGER AFTER

  • 最新の日付と時刻を表示します。

    マルク・

  • +0

    良い提案ですが、元の投稿への編集をご覧ください。 –

    0

    タイムスタンプタイプのフィールドを作成します。このフィールドは、その行でデータが変更されるたびに更新されます。ああ、文字通り相対的なタイムスタンプなので、バージョン管理にしか使用できません。詳細はこちらをご覧ください。 http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx

    +0

    良い提案ですが、フィールドが私の側で更新されているかどうかは、私が作業しているサービスが更新されるとすぐにはわかりません。彼らがすぐに受信した時間を送信する場合、これは動作します。それ以外の場合は、実際のDateTimeを変換する必要があります。 –

    0

    次の例では、この作業を行う必要があります。 ModifiedOnまたは同様のDateTimeフィールドをdbテーブルに追加します。

    insert into foo (field1, field2, ...., ModifiedOn) 
    values (value1, value2,...., GetDate()) 
    

    または更新

    update Foo 
    set field1 = value1, 
        field2 = value2, 
        . 
        . 
        . 
        ., 
    
        ModifiedOn = GetDate() 
    Where .... 
    
    1

    別のオプションは、ここでは、ローカルの日付と時刻の値にUTCの日付と時刻をマップカレンダーテーブルを使用することです。

    ここでの欠点は、粒度の一部が失われていることです。秒が重要な場合、私はこれを実装しません。カレンダーレコードのサイズを調べ、トランザクションテーブルの各レコードの日時を格納するサイズと比較することができます。ボリュームが小さければ小さいほど、このソリューションはあまり有益ではありません。また、ソリューションの将来のレコードを自動的かつ無人で構築していないと、テーブルがレコードを使い果たしてしまい、あなたの後ろに来る人(おそらくあなた自身も)のために時限爆弾が残ってしまいます。

    利点ですが、このテーブルのクエリは(これは整数なので)すばやく実行できます。また、NYCサーバーをSacramentoに移行する必要があると判断した場合は、「localDateTime」を更新し、UTC時間をそのままにしておくことができます。

    テーブル構造(粒度は、あなたのニーズに最高になります):

    ID int  
    utc_month int 
    utc_day int 
    utc_year int 
    utc_hour int 
    utc_minute int 
    local_month int 
    local_day int 
    local_year int 
    local_hour int 
    local_minute int 
    

    はまだ オプションは、マネージアセンブリを展開することである(再びボリュームによって異なります)。 (手順については、このサイトを参照してください、あなたはサーバーの設定変更を行う必要があります。 How to implement a managed udf or sp)ここ


    は、私は次のコードは戻ります、私のudf

    public static SqlDateTime udf_ConvertUTCDateTime(SqlDateTime utcDateTime) 
    { 
        DateTime dt = utcDateTime.Value; 
        utcDateTime = dt.ToLocalTime(); 
        return utcDateTime; 
    } 
    

    に入れてC#のです変換されたUTC日時挿入またはトリガーでその値を使用するだけです。

    Declare @D datetime 
    set @D = GetUTCDate() 
    
    select @D 
    
    select dbo.udf_ConvertUTCDateTime(@D) 
    
    +0

    新しいコメントが投稿されたので、datetimeの変換は管理されたudfで実装するのが最も簡単です。これは、挿入時にトリガで行うこともできますし、単にutcをinsert文のローカルdatetimeに変換することで指定することもできます。このudfは、ローカルマシンのutcオフセットを使用します。これは、もちろんSQLインスタンスで有効になっているCLRに左右されます。 –

    関連する問題