![]() |
坚强的猴子 · PostgreSQL遍历Json_posgr ...· 1 月前 · |
![]() |
跑龙套的皮蛋 · PostgreSQL遍历Record各例的值 ...· 1 月前 · |
![]() |
犯傻的海龟 · 如何用random ...· 4 月前 · |
![]() |
威武的苹果 · 动态调整ConstaintLayout元素位 ...· 9 月前 · |
![]() |
咆哮的酱肘子 · JavaScript如何正确处理Unicod ...· 1 年前 · |
![]() |
刀枪不入的莴苣 · 对接对象存储 TOS--批式计算 ...· 1 年前 · |
![]() |
逆袭的围巾 · WM_PAINT消息 - Win32 ...· 2 年前 · |
在postgresql(windows 9.2.4版)中比较日期时,我遇到了一个奇怪的情况。
我的表中有一列,名为update_date,类型为'timestamp without timezone‘。
客户端可以在此字段中仅搜索日期(即: 2013-05-03)或带时间的日期(即: 2013-05-03 12:20:00)。
此列的值为当前所有行的timestamp,日期部分相同(2013-05-03),但时间部分不同。
当我比较这一列时,我得到了不同的结果。如下所示:
select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-03' -> No results
select * from table where update_date >= '2013-05-03' AND update_date < '2013-05-03' -> No results
select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-04' -> results found
select * from table where update_date >= '2013-05-03' -> results found
我的问题是,我如何才能使第一个查询能够得到结果,我的意思是为什么第三个查询可以工作,而第一个查询不能工作?
当您比较
update_date >= '2013-05-03'
postgres时,会将值强制转换为相同类型的值以进行比较。所以你的'2013-05-03‘被转换为'2013-05-03 00:00:00’。
因此,对于update_date = '2013-05-03 14:45:00‘,您的表达式将是:
'2013-05-03 14:45:00' >= '2013-05-03 00:00:00' AND '2013-05-03 14:45:00' <= '2013-05-03 00:00:00'
这始终是
false
要解决此问题,请将update_date转换为
date
select * from table where update_date::date >= '2013-05-03' AND update_date::date <= '2013-05-03' -> Will return result
使用
range
类型。如果用户输入日期:
select *
from table
where
update_date
tsrange('2013-05-03', '2013-05-03'::date + 1, '[)');
如果用户输入时间戳,则不需要
::date + 1
部分
http://www.postgresql.org/docs/9.2/static/rangetypes.html
http://www.postgresql.org/docs/9.2/static/functions-range.html
@Nicolai关于强制转换以及为什么条件对于任何数据都是假的是正确的。我猜您更喜欢第一种形式,因为您希望避免对输入字符串进行日期操作,对吗?你不需要害怕:
SELECT *
FROM table
WHERE update_date >= '2013-05-03'::date
AND update_date < ('2013-05-03'::date + '1 day'::interval);
使用Date convert与date进行比较:尝试如下:
select * from table
where TO_DATE(to_char(timespanColumn,'YYYY-MM-DD'),'YYYY-MM-DD') = to_timestamp('2018-03-26', 'YYYY-MM-DD')
您也可以使用
BETWEEN
运算符。
下面是一个简单的例子:
SELECT
customer_id,
payment_id,
amount,
payment_date
payment
WHERE
payment_date BETWEEN '2007-02-07' AND '2007-02-15';
您还可以选择不在这些日期之间的所有内容:
SELECT
customer_id,
payment_id,
amount,
payment_date
payment
WHERE
payment_date NOT BETWEEN '2007-02-07' AND '2007-02-15';
下面是一个更高级的例子,涉及基于天的时间戳增量:
SELECT
api_project.name,
api_project.created,
survey_response.created AS response_date,
WHEN survey_response.created
BETWEEN api_project.created AND
(api_project.created + INTERVAL '180 days')
THEN 'first_6_months'