2009-12-10 99 views
5

當插入新數據時,是否有數據庫級別的函數(觸發器或某些東西)可用於更改DateTime字段?問題在於,我正在整合的一項服務恰好在格林威治標準時間發出了它的所有時間(在這種情況下,在它們的最後收到一些信息的時間)。如何更改更新日期時間字段?

我需要自動更改此值以反映數據庫服務器所在時區的時間。例如,如果他們在下午2:34發送給我,但我在紐約市,我希望它可以輸入到db上午9:34。這也必須考慮到格林威治標準時間與服務器的任何地方之間的夏令時差異,這似乎是一場噩夢。有什麼建議麼?

此外,我使用SQL Server 2005,如果有幫助。

編輯:

讓我澄清一件事。進入這一列的日期是每隔一段時間(5,10,15分鐘)批量檢索的,所以我認爲唯一的辦法就是改變一次收到的時間,而不是添加一個TimeModified字段或其他東西。這甚至可行嗎?

回答

9

你可以爲它獲取設置DateTime創建

  • 一個默認值當你插入一個新的記錄

    CREATE TABLE dbo.YourTable 
    (........, 
        LastModifiedOn DATETIME 
         CONSTRAINT DF_YourTable_LastModifiedOn DEFAULT (GETDATE()) 
    ) 
    
  • 一個AFTER UPDATE觸發器這臺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應始終最新並顯示上次修改日期/時間。這裏

馬克

+0

很好的建議,但請參閱編輯我原來的帖子。 – 2009-12-10 18:40:34

0

創建Timestamp類型的字段 - 只要在該行中修改了任何數據,該字段就會更新。唉,它實際上是一個相對時間戳,所以它只能用於版本控制。更多的信息可以在這裏找到: http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx

+0

好的建議,但我還不確定當我使用的服務更新它時,該字段是否更新在我的身邊。如果他們立即發送收到的時間,這將工作;否則我將不得不轉換他們發送的實際日期時間。 – 2009-12-10 16:31:15

0

下面的例子應該做的工作。將ModifiedOn或類似的DateTime字段添加到您的數據庫表中。

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

或更新

update Foo 
set field1 = value1, 
    field2 = value2, 
    . 
    . 
    . 
    ., 

    ModifiedOn = GetDate() 
Where .... 
1

另一種選擇是使用在那裏你映射一個UTC日期和時間以本地日期和時間值的日曆表。

這裏的缺點是某些粒度的損失。如果秒很重要,我不會執行這個;您可以查看日曆記錄的大小並將其與您的事務表中每個記錄的存儲日期時間的大小進行比較。顯然,體積越小,解決方案的優勢越小。此外,如果您不在自動和無人蔘與的情況下重新填充解決方案中的未來記錄,表格將「耗盡」記錄,並且您將留下一個定時炸彈,以便在您之後進入任何人(也許您自己)。

雖然優點是您將能夠更快地執行此表上的任何查詢(因爲它是一個整數)。此外,如果您曾決定您的NYC服務器需要遷移到薩克拉門託,您可以更新「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


這裏是C#,我把我的udf

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

下面的代碼將返回轉換的UTC日期時間。只需在插入或觸發器中使用該值即可。

Declare @D datetime 
set @D = GetUTCDate() 

select @D 

select dbo.udf_ConvertUTCDateTime(@D) 
+0

隨着新的評論發佈,它聽起來像轉換日期時間將是最容易實施的託管udf。這可以在插入觸發器中完成,或者簡單地通過在插入語句中將utc轉換爲本地日期時間來指定。這個udf使用本地機器的utc偏移量。這當然取決於爲SQL實例啓用CLR。 – 2009-12-10 20:41:03