我正在尝试从数据库中获取行,该行以以下格式保存日期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';
答案 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);