2013-07-20 64 views
1

我有一個數據庫視圖,可以獲取某些工作項的狀態。例如,它會得到一個開始日期和結束日期,然後根據GetDate()執行一些數學運算以返回「Work Remaining」類型的答案。處理時區

問題是,數據庫服務器在美國,我坐在澳大利亞。

因此,現在這裏的時間是7月20日19時33分,服務器上的GetDate() 20日返回02h33。

如何處理時區?我的用戶配置文件應該有時區字段,並在客戶端扣除或增加小時數?問題在於,所有事情都需要操縱日期和時間。即應用程序和任何報告。

例如,我有一種看法,即將特定作品的剩餘時間返回給我。它使用GETDATE()來計算的:

ALTER VIEW [dbo].[vwSprintSummary] AS 
SELECT 
    SprintId, 
    SprintName, 
    MIN(DateValue) AS FirstSprintDate, 
    MAX(DateValue) AS LastSprintDate, 
    SprintEndDate, 
    COUNT(DISTINCT PersonId) AS AssignedPeople, 
    COUNT(DISTINCT ProjectResourceId) AS AssignedRoles, 
    SUM(AssignedProductiveHours * CanBurnDown) AS Capacity, 
    SUM(CASE WHEN CAST(GETDATE() AS DATE) <= DateValue THEN AssignedProductiveHours* CanBurnDown ELSE 0 END) AS RemainingCapacity 
FROM [vwSprintDailyBreakdown] 
GROUP BY SprintName, SprintId, SprintStartDate, SprintEndDate 
GO 

不知怎麼的,我需要的GETDATE()更改爲「DATEADD ......」這樣我就可以在正確的時區得到答案?

在這種情況下,「修復」將改變GETDATE()DATEADD(HOUR, 17, GETDATE())

硬編碼的,我知道,但在本質上,這將解決問題。

有沒有辦法以某種方式告訴服務器我的區域,並根據我的位置得到它的返回日期?

+3

部分取決於相關日期/時間的性質。例如,源數據是否也有相關的時區,還是隻是「即時即時」?工作項目的「結束日期」真的意味着什麼 - 它*具有關聯的時區嗎?在這裏有很多事情需要思考,並且沒有一個通用的答案。# –

+0

謝謝喬恩。我已經發布了一個我的問題的例子。時間存儲爲應用程序中的Datetime.Now。實際上,時間部分未被使用。我專注於日子(大多數日期存儲爲DATE)。 – Craig

+0

爲什麼他們存儲爲'DateTime.Now'?正如Dai所說,通常情況下,通常情況下,以UTC來存儲事件會更好。我個人會在查詢中發送當前的日期/時間,而不是在SQL中使用GETDATE - 如果你可以控制一個地方的所有內容,它會更簡單(我想!) –

回答

4

一般來說,將所有信息以UTC存儲在數據庫中,並以UTC方式執行所有業務邏輯處理,只在表示層邏輯層中轉換爲本地時區 - 這種方法將爲您節省不少麻煩,並且意味着數據庫服務器可以(也應該)保持幸福地不知道你的時區。

在我自己的項目中,我傾向於信任Web服務器的時鐘而不是數據庫服務器的時鐘,所以我從不在SQL Server上使用GETUTCDATE(),而是提供所有日期和時間作爲SQL參數,例如。查詢「今天放置的訂單」將提供其自己對「今天」的定義(即通過提供最小和最大日期/時間值)。

+0

感謝戴。我已經發布了一個我的問題的例子。我得到基於GETDATE()的項目的事實。這是一種觀點,但基於另一種觀點,即所有硬數據挖掘。另一個視圖不使用GETDATE()。它只是將所有數據集中在一起,然後我使用其他視圖和查詢(大多數情況下來自實體框架)來顯示數據。我現在唯一的問題是這個視圖(在這個例子中)使用GetDate()。我會傳遞一個'TimeDelta'給視圖,有些人會修改GETDATE值嗎? – Craig