我需要在PG中插入行,其中一个字段是日期和时间,带有时间戳,这是事件发生的时间,所以我不能使用 - > postgres在插入时的current_timestamp函数,那么如何将之前收集的时间和日期插入到pg行中,其格式与current_timestamp在该时间点创建的格式相同。
答案 0 :(得分:60)
时间戳没有“格式”。
处理时间戳的推荐方法是使用PreparedStatement,您只需在SQL中传递占位符,并通过编程语言的API传递“真实”对象。由于我不懂Python,我不知道它是否支持PreparedStatements以及它的语法如何。
如果要将时间戳文字放入生成的SQL中,则在指定值时需要遵循一些格式规则(文字确实具有格式)。
Ivan的方法会起作用,虽然我不确定它是否依赖于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'));
答案 1 :(得分:32)
如果您使用psycopg2
(可能还有其他一些客户端库),您只需将Python datetime
对象作为parameter传递给SQL查询:
from datetime import datetime
dt = datetime.now()
cur.execute('INSERT INTO some_table (somecol) VALUES (%s)', (dt,))
here列出了更多可以适应SQL的Python类型(并在执行查询时作为Python对象返回){。{3}}。
答案 2 :(得分:7)
答案 3 :(得分:2)
几乎任何合理的格式都接受日期和时间输入, 包括ISO 8601,SQL兼容,传统POSTGRES等。 对于某些格式,日期输入中的月,日和年的排序是 含糊不清,并且支持指定预期的排序 这些领域。
换句话说:只需写下任何内容即可。
或者使用所有明确的格式检查this table。
答案 4 :(得分:1)
当然,只需为格式为'2011-05-16 15:36:38'
的格式传递该时间戳列的字符串值(您还可以在其中附加时区,如'PST'
)。 PostgreSQL会自动将字符串转换为时间戳。见http://www.postgresql.org/docs/9.0/static/datatype-datetime.html#DATATYPE-DATETIME-INPUT
答案 5 :(得分:-1)
from datetime import datetime as dt
然后在您的代码中使用它:
cur.execute('INSERT INTO my_table (dt_col) VALUES (%s)', (dt.now(),))
答案 6 :(得分:-3)
只需使用
现在()
或
CURRENT_TIMESTAMP
我更喜欢后者,因为我不喜欢额外的括号,但这只是个人偏好。