为什么“ =”运算符未在SQL查询中给出预期结果?

时间:2018-07-09 11:27:32

标签: sql postgresql timestamp

我正在尝试从数据库中获取行,该行以以下格式保存日期2018-07-09 13:22:40

当我这样编写以下查询时:-

SELECT * 
FROM table_name 
WHERE time_col = '2018-07-09 13:22:40';

它返回一行

但是当我编写这样的查询(无结果)时:

SELECT * 
FROM table_name 
WHERE time_col = '2018-07-09';

它什么也没回报。

对于其他运算符,它通过以下查询可用于<><=>=,但为什么不使用“ =”运算符

SELECT * 
FROM table_name 
WHERE time_col < '2018-07-09';

3 个答案:

答案 0 :(得分:1)

假设您的列的类型为timestamp,则字符串常量'2018-07-09'将由Postgres转换为时间戳,但时间为00:00:00

所以下面的查询:

SELECT * 
FROM table_name 
WHERE time_col = '2018-07-09';

的实际运行方式为:

SELECT * 
FROM table_name 
WHERE time_col = timestamp '2018-07-09 00:00:00';

当然与值2018-07-09 13:22:40不匹配。

要获取特定日期的行,可以将timestamp列强制转换为日期:

SELECT * 
FROM table_name 
WHERE time_col::date = date '2018-07-09'

但是,这将阻止time_col列上的使用。因此,如果该版本的查询速度较慢,则必须还原为范围查询:

SELECT * 
FROM table_name 
WHERE time_col >= timestamp '2018-07-09 00:00:00'
  and time_col < timestamp '2018-07-10 00:00:00'

答案 1 :(得分:0)

它不起作用,因为列是时间戳记(日期和时间)。但是您尝试将其与日期(无日期)进行比较,这就是为什么它们不相等的原因。

在oracle中使用trunc函数。截断功能从日期开始减少时间,仅保留日期:

SELECT * FROM table_name WHERE trunc(time_col) = '2018-07-09';

对于postgres,请使用显式强制转换:

SELECT * FROM table_name WHERE time_col::date = '2018-07-09';

答案 2 :(得分:0)

SELECT *FROM table
WHERE update_date >= '2013-05-03'::date
AND update_date < ('2013-05-03'::date + '1 day'::interval);