我有一個數據庫視圖,可以獲取某些工作項的狀態。例如,它會得到一個開始日期和結束日期,然後根據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())
硬編碼的,我知道,但在本質上,這將解決問題。
有沒有辦法以某種方式告訴服務器我的區域,並根據我的位置得到它的返回日期?
部分取決於相關日期/時間的性質。例如,源數據是否也有相關的時區,還是隻是「即時即時」?工作項目的「結束日期」真的意味着什麼 - 它*具有關聯的時區嗎?在這裏有很多事情需要思考,並且沒有一個通用的答案。# –
謝謝喬恩。我已經發布了一個我的問題的例子。時間存儲爲應用程序中的Datetime.Now。實際上,時間部分未被使用。我專注於日子(大多數日期存儲爲DATE)。 – Craig
爲什麼他們存儲爲'DateTime.Now'?正如Dai所說,通常情況下,通常情況下,以UTC來存儲事件會更好。我個人會在查詢中發送當前的日期/時間,而不是在SQL中使用GETDATE - 如果你可以控制一個地方的所有內容,它會更簡單(我想!) –