【发布时间】:2011-08-26 11:14:59
【问题描述】:
我需要在PG中插入行,其中一个字段是带有时间戳的日期和时间,这是事件发生的时间,所以我不能使用 --> 插入时Postgres的current_timestamp函数,那怎么能然后,我将之前收集的时间和日期以与 current_timestamp 在该时间点创建的格式相同的格式插入到 pg 行中。
【问题讨论】:
标签: python postgresql datetime
我需要在PG中插入行,其中一个字段是带有时间戳的日期和时间,这是事件发生的时间,所以我不能使用 --> 插入时Postgres的current_timestamp函数,那怎么能然后,我将之前收集的时间和日期以与 current_timestamp 在该时间点创建的格式相同的格式插入到 pg 行中。
【问题讨论】:
标签: python postgresql datetime
时间戳没有“格式”。
处理时间戳的推荐方法是使用 PreparedStatement,您只需在 SQL 中传递一个占位符并通过编程语言的 API 传递一个“真实”对象。由于我不了解 Python,我不知道它是否支持 PreparedStatements 以及它的语法。
如果您想将时间戳文字放入生成的 SQL 中,则在指定值时需要遵循一些格式规则(文字确实有格式)。
Ivan 的方法会起作用,虽然我不能 100% 确定它是否取决于 PostgreSQL 服务器的配置。
指定时间戳文字的配置(和语言)独立解决方案是 ANSI SQL 标准:
INSERT INTO some_table
(ts_column)
VALUES
(TIMESTAMP '2011-05-16 15:36:38');
是的,这是关键字 TIMESTAMP 后跟 ISO 样式格式的时间戳(TIMESTAMP 关键字定义了该格式)
另一种解决方案是使用to_timestamp() 函数,您可以在其中指定输入文字的格式。
INSERT INTO some_table
(ts_column)
VALUES
(to_timestamp('16-05-2011 15:36:38', 'dd-mm-yyyy hh24:mi:ss'));
【讨论】:
ms 来节省毫秒精度。
TIMESTAMP 为我节省了一大堆时间,无需将 Python 中的时区附加到我的所有日期时间值。
如果您使用 psycopg2(可能还有其他一些客户端库),您可以简单地将 Python datetime 对象作为 parameter 传递给 SQL 查询:
from datetime import datetime, timezone
dt = datetime.now(timezone.utc)
cur.execute('INSERT INTO mytable (mycol) VALUES (%s)', (dt,))
(这里假设在数据库端使用timestamp with time zone 类型。)
列出了更多可以适应 SQL 的 Python 类型(并在执行查询时作为 Python 对象返回)here。
【讨论】:
【讨论】:
now 与current_timestamp 完全相同
几乎可以接受任何合理格式的日期和时间输入, 包括 ISO 8601、SQL 兼容、传统 POSTGRES 等。 对于某些格式,日期输入中的月、日和年的顺序是 模棱两可,并且支持指定预期的排序 这些字段。
换句话说:只要写任何东西就可以了。
或检查this table 的所有明确格式。
【讨论】:
当然,只需为该时间戳列传递一个字符串值,格式为:'2011-05-16 15:36:38'(您也可以在此处附加一个时区,例如'PST')。 PostgreSQL 会自动将字符串转换为时间戳。见http://www.postgresql.org/docs/9.0/static/datatype-datetime.html#DATATYPE-DATETIME-INPUT
【讨论】:
from datetime import datetime as dt
然后在您的代码中使用它:
cur.execute('INSERT INTO my_table (dt_col) VALUES (%s)', (dt.now(),))
【讨论】:
随便用
现在()
或
CURRENT_TIMESTAMP
我更喜欢后者,因为我喜欢没有额外的括号,但这只是个人喜好。
【讨论】: