[英]How to compare dates with psycopg2 (PostgreSQL)?
通過使用PostgreSQL Python模塊psycopg2,我想找到一些結束時間落在某個時間戳之前的行。 我嘗試使用帶有cursor.execute(…)
的SQL查詢上的cursor.execute(…)
來執行此操作, … where end_time < %s
,其中%s由具有時區的datetime.datetime
對象替換。 psycopg2生成的SQL是:
select * from my_table where end_time < '2014-05-01T13:00:00+00:00'::timestamptz;
返回一行如下:
id | start_time | end_time
331 | 2014-05-01 14:55:00 | 2014-05-01 15:05:00
結束時間不早於2014-05-01在格林威治標准時間13:00,與我的預期相反。
在psycopg2中執行所需時間選擇的正確方法是什么?
好吧,使用PostgreSQL時間戳和 表中的 時區解決了這個問題。
以下是問題所在的詳細信息:
我將時區感知時間戳放在不支持時區的列中 。 我假設timestamp without time zone
列的timestamp without time zone
將包含UTC時間(如timestamp with time zone
),但它實際上包含本地時間的時間戳 ,如文檔中所述:
沒有時區的時間戳和帶時區的時間戳之間的轉換通常假定應該采用沒有時區值的時間戳或作為時區本地時間給出。 可以使用AT TIME ZONE為轉換指定不同的時區。
因此,在中國時,00:00 UTC將在08:00
存儲在timestamp without time zone
的列timestamp without time zone
中。
在進行比較時,比如“ 沒有時區的時間戳”<“ 帶時區的時間戳”,我在文檔中找不到PostgreSQL的功能。 然而,在該問題中觀察到的結果與首先以相同方式移除時區的想法一致,並且比較了沒有時區的時間戳。 我不應該對結果感到驚訝:遲到的時間“15:00”確實早於13:00 UTC,在中國(UTC + 8)。 關鍵是要知道顯示(和存儲)的時間是在本地時區。
我從中得到的道德是: 明確地處理有時區和無時區的時間戳之間的轉換 。
指定應顯示時間的時區。 如果start_time
和end_time
是沒有時區的時間戳,如輸出所示,那么你還需要告訴postgresql它們應該在什么時區。
select
id,
start_time at time zone 'UTC' at time zone 'UTC',
end_time at time zone 'UTC' at time zone 'UTC'
from my_table
where end_time at time zone 'UTC' < %s
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.