2011-05-16 61 views
23

我需要將行插入PG的領域之一是日期和時間與時間戳插入CURRENT_TIMESTAMP於Postgres,這是事件發生的時間,所以我不能使用 - 在> CURRENT_TIMESTAMP的Postgres的功能插入的時間,那麼我該如何將我以前收集的時間和日期插入到pg行中,格式與當前時間戳由current_timestamp創建的格式相同。如何通過Python

回答

44

時間戳不具有 「格式」。

推薦的方法來處理時間戳是使用PreparedStatement,你只是通過在SQL的佔位符,並通過您的編程語言的API傳遞一個「真實」的對象。由於我不知道Python,我不知道它是否支持PreparedStatements以及它的語法。

如果你想要把文字時間戳到您生成的SQL,則需要指定值(文字確實有一個格式)時應該遵循的一些格式規則。

伊萬的方法將工作,雖然我不是100%肯定,如果它取決於PostgreSQL服務器的配置。

的配置(和語言)獨立的解決方案來指定一個時間戳文字是ANSI SQL標準:

INSERT INTO some_table 
(ts_column) 
VALUES 
(TIMESTAMP '2011-05-16 15:36:38'); 

是的,其次是在ISO樣式設置格式的時間戳關鍵字TIMESTAMP(在TIMESTAMP關鍵字定義格式)

其他的解決辦法是使用to_timestamp()功能,在這裏你可以指定輸入文本的格式。

INSERT INTO some_table 
(ts_column) 
VALUES 
(to_timestamp('16-05-2011 15:36:38', 'dd-mm-yyyy hh24:mi:ss')); 
+0

謝謝 - > format('Y-m-d H:i:s');正在爲我工​​作。 – 2018-02-28 21:33:39

1

日期和時間的輸入接受幾乎任何合理的格式,包括 ISO 8601,SQL兼容的,傳統Postgres的和其他。 對於某些格式,日期輸入中月份,日期和年份的排序爲 含糊不清,並且有支持指定這些字段的預期排序 。

換句話說:只寫任何東西,它會工作。

或檢查this table與所有明確的格式。

-4

只需使用

現在()

CURRENT_TIMESTAMP

我更喜歡後者,因爲我喜歡沒有額外的括號但是那只是個人偏愛。

+1

該問題明確指出,「我不能在插入時使用 - > current_timestamp函數Postgres。 – 2013-09-04 22:19:31

17

如果使用psycopg2(可能還有一些其它的客戶端庫),你可以簡單地通過一個Python datetime對象作爲parameter到SQL查詢:

from datetime import datetime 

dt = datetime.now() 
cur.execute('INSERT INTO some_table (somecol) VALUES (%s)', (dt,)) 

更多的Python類型可以改編成SQL (並在執行查詢時作爲Python對象返回)列出here

+3

您應該避免傳遞一個表示當地時間的樸素日期時間對象:它可能不明確,並且數據庫連接可能使用不同的時區。使用'datetime.now(timezone.utc)'等有意識的日期時間對象,並確保在數據庫端使用「帶時區的時間戳」。 – jfs 2015-10-06 16:35:00

0

你可以試試這個,

from datetime import datetime as dt 
then use this in your code: 

cur.execute('INSERT INTO my_table (dt_col) VALUES (%s)', (dt.now(),))