2011-12-21 68 views
0

我正在尋找一種方法,如何從sql server有效地請求數據,假設請求來自不同的時區。SQL服務器文化連接

從澳大利亞(UTC/GMT11小時)例如請求將要求比2005-11-19 18:00:00

,但服務器在加拿大(UTC/GMT -5小時)和較舊的記錄所有記錄保存爲加拿大人。

通過UI

加拿大用戶會挑選「2005-11-19 18:00:00」的日期,我們將做到這一點seelct到SQL Server從澳大利亞用戶假設用戶選取相同的日期

select * from table1 where added < '2005-11-19 18:00:00' 

同一選擇通過UI必須

select * from table1 where added < '2005-11-19 02:00:00' 

我的問題是什麼是查詢到不同的時區的SQL Server和得到的結果假定時區的正確途徑。

Effectively Converting dates between UTC and Local (ie. PST) time in SQL 2005這樣的答案不起作用,因爲我想通過連接聲明式執行它,並且不希望將任何邏輯放在sql中。

回答

2

如果你想存儲一段時間,你應該在數據庫上使用UTC(這是最常見的情況,例如日誌記錄等)。

如果要存儲位置特定的日期,請使用包括其時區信息的日期時間。例如,需要適當存儲包括時間在內的生日(需要轉換爲UTC可能會改變日期)。

這同樣適用於查詢。通常,用戶在查詢中輸入本地時間,並且需要將其轉換爲UTC進行查詢。但是,如果您查詢生日等內容,則不希望執行此轉換,因爲用戶無法獲得預期的結果。

所以答案真的是「它要看」。最糟糕的是當地時間沒有時區信息,因爲這通常無法恢復到正確的日期。請注意,夏時制時間也會影響時區,並且由於規則隨時間而改變,因此即使您知道實際日期和服務器時區(不包括DST)時,也可能無法正確重建本地日期。

因此,如果您不想SQL中使用邏輯,請在數據庫上使用UTC,然後將日期轉換爲UTC以進行插入/更新/查詢。

-1

我的問題是什麼是正確的方式來查詢從不同時區的SQL服務器,並得到結果 假設時區。

僱用一位知道該問題並在程序代碼中處理該問題的程序員。

我想通過連接聲明性地做到這一點,並不想在sql中放置任何邏輯。

糟糕的解決方案。這是一個代碼問題。

+0

您是否認爲在代碼中進行所有轉換完全是正確的方式?我發現這種方式非常手動,可能會有更智能/自動的方式。 – Cherven 2011-12-21 15:40:02

+0

那麼,手冊是相對的。我發現它是最靈活的。我將UTC上的所有時間戳存儲在服務器上,並根據需要處理本地化 - 這可能會發生變化。 – TomTom 2011-12-21 15:57:26