如何将 SQL 中的 PM 日期时间与基于毫秒的时间进行比较?

How to compare PM datetime in SQL to millisecond-based time?

我有一个这种格式的数据库字段:

 '2019/08/14 11:07:30 AM'

我想以这种格式与来自 Python 的数据框单元格进行比较:

'2020-04-06T13:40:23.000000000'

我试过将这些字段简单地与 >= 进行比较,但得到的 ORA-01681 文字与格式字符串不匹配。

     AND s.time1 >= '2020-12-06T05:07:27.000'
     AND s.time2 >= '2020-12-06T05:07:27.000'
ORA-01681 literal does not match format string

当我尝试将它们转换为日期时间时会发生同样的情况,但我得到的数据类型无效。我做错了什么以及比较两者的正确 SQL 表达式是什么?

     AND CAST(s.time1 AS DATETIME) >= CAST('2020-12-06T05:07:27.000' AS DATETIME)
     AND CAST(s.time2 AS DATETIME) >= CAST('2020-12-06T05:07:27.000' AS DATETIME)

显然,如果毫秒四舍五入是可以的,因为它们始终为 0,并且在这种情况下数据库时间没有那么精确。

假设您将日期存储为 Oracle timestamps ,那么您只需要转换为比较提供的文字值。为此,您可以使用 to_timestamp():

and s.time1 >= to_timestamp('2020-12-06T05:07:27.000', 'yyyy-mm-dd"T"hh24:mi:ss.ff3')

如果您使用的是 date,那么我建议您修剪字符串,然后转换为 date:

and s.time1 >= to_char(substr('2020-12-06T05:07:27.000', 1, 19),  'yyyy-mm-dd"T"hh24:mi:ss')

如果你想修改查询字符串,那么你可以将逻辑表达为:

s.time1 > timestamp '2020-12-06T05:07:27.000'

但是,我不推荐这种方法,因为您应该将值作为参数传递。

相反,将值作为 datetimestamp 参数传递以进行比较:

s.time1 > :time1

或者,如果您必须将其作为字符串传递,请将其解析为时间戳:

s.time1 > to_timestamp(:time1_str, 'YYYY-MM-DD"T"HH24:MI:SS.FF3')