2013-04-29 53 views
1

我最近升級了一個Django項目從1.3到1.5,以開始使用時區處理。因爲我是個白癡,所以我的Django時區被設置爲「America/NewYork」,而不是使用UTC。 Turning Django's timezone support on automatically sets Postgres to UTC。現在我遇到了運行直接SQL查詢的問題。我似乎無法獲得正確的時區過濾。下面是我在做什麼:Django時區處理與Postgres

  1. 從用戶表單
  2. 交換,爲UTC在我看來stamp.astimezone(timezone('UTC'))
  3. 傳遞的是,由於原始的SQL查詢參數(start.strftime('%Y-%m-%d %H:%M:00%z')),使用接受一個時間戳字段一個django.db.connection的光標

是被執行(登錄到控制檯)查詢看起來是正確的:

SELECT to_char(created, 'YYYY-MM-DD HH12:MIam'), 
COALESCE(heat_flow_1, 0.0)/1000.0, COALESCE(heat_flow_2, 0.0)/1000.0, 
COALESCE(heat_flow_3, 0.0)/1000.0 
FROM results_flattenedresponse 
WHERE installation_id = '66' 
AND created BETWEEN TIMESTAMPTZ '2013-04-26 13:00:00+0000' AND TIMESTAMPTZ '2013-04-26 16:00:00+0000' 

如果我將它複製並粘貼到PGAdmin中,我就可以得到我正在尋找的東西,從美國東部時間上午9點開始一組行。但是,從django.db.connection的光標返回的數據集將所有日期向前推進4個小時(EDT和UTC之間的差異)。其餘數據實際上是正確的,但日期被視爲UTC並推送到用戶的活動時區(即使我稱爲停用)。我覺得我有一堆不好的想法連線在一起試圖解決這個問題,所以我不確定哪些部分是好主意,什麼是壞主意。

編輯/ UPDATE

我已經只有當我查詢數據庫,直接在這裏嘗試了一些其他的東西,仍然得到不好的結果,但。上面步驟2和步驟3中的內容似乎並不重要。我能看到的一個快速解決方案實際上是在查詢中設置時區,例如SET timezone='America/New_York';,然後撤消它,但這對於數據完整性來說似乎是一個非常糟糕的主意。

另一個奇怪的位:我已將Django時區設置爲UTC,但是當我下載本地副本並查看數據時,它仍然標記爲已設置爲America/New_York。我不知道這是由於我的本地服務器上的設置,還是由於Django插入到第二個(非默認)數據庫時數據沒有被正確本地化的錯誤,但如果這是我希望我的問題會消失。

+0

如果問題很重要,我使用兩個數據庫和一個自定義路由器來決定在ORM中調用哪個數據庫,但是我在這裏按名稱調用連接。 – Tom 2013-04-29 20:39:30

回答

1

由於服務器現在是在UTC時間,創建回來爲默認UTC,所以第一位必須是

SELECT to_char(created AT TIME ZONE %s, 'YYYY-MM-DD HH12:MIam') 

並傳入你希望看到的時區。這不是世界上最好的方法,但它適用於我這裏,因爲查詢全部在具有相關時區作爲屬性的對象內運行。