在Postgres中,我试图在WHERE谓词中进行基于日期/时间的查询。
当我尝试选择此日期/时间格式时,SQL错误提示该值必须为整数。我不确定为什么不认为我的17分钟不是整数,或者为什么只将其视为1而不是17?
SELECT *
FROM history
WHERE create_time > TO_TIMESTAMP('2018-10-08T23:17:44.728','yyyy-MM-dd''T''HH:mm:ss.SSS');
错误:“ HH”的值“:1”无效 详细信息:值必须是整数。 SQL状态:22007
答案 0 :(得分:0)
问题是由于使用了''T''
之前的HH
,并且数据库发出信号,您可能会使用
TO_TIMESTAMP('2018-10-08 23:17:44.728','yyyy-mm-dd HH24:MI:SS.MS')
相反。
答案 1 :(得分:0)
您正试图使用包含T的日期值,并且似乎正试图向TO_TIMESTAMP声明T是要忽略的文字值。问题是您通过放置'T'
(撇号-T撇号,转义)来执行此操作,该语法将解析器打开了3个字符,然后在期望HH时从23:17遇到':1' :
--your date, and underneath it, the format you gave
2018-10-08T23:17:44.728
yyyy-MM-dd'T'HH:mm:ss.SSS
您能看到HH与(1)垂直对齐吗? Postgres抱怨它期望可以解析为23的整数,但是遇到了字符串:1,它不是整数。
这个问题:
Postgres- have to_timestamp() ignore/not read a specific character in middle of date/time string
简单地说,您可以将T所在的格式放在空格中,或者仅将必须转换的字符串转换为Timestamp-postgres显然可以将该字符串解析为Timestamp,而不必为它明确地设置格式< / p>
尝试:
SELECT *
FROM history
WHERE create_time > TIMESTAMP '2018-10-08T23:17:44.728'
SELECT *
FROM history
WHERE create_time > cast('2018-10-08T23:17:44.728' as timestamp)
SELECT *
FROM history
WHERE create_time > TO_TIMESTAMP('2018-10-08T23:17:44.728','yyyy-MM-dd HH:mm:ss.SSS');
您甚至可能会发现它可行:
SELECT *
FROM history
WHERE create_time > TO_TIMESTAMP('2018-10-08T23:17:44.728', 'yyyy MM dd HH mm ss SSS')
数字与格式字段对齐,空格用于您要忽略的其他所有内容(连字符,冒号,点等)