下面是一些示例代码-我相信这应该很简单,下面的代码与我在web/stackoverflow中找到的代码片段相同。。
create table mydb (start timestamptz);
insert into mydb values ('2019-08-05 10:00:00');
select * from mydb where 'start' BETWEEN '2019-08-01 00:00:00' and '2019-08-30 00:00:00';
select * from mydb where 'start' BETWEEN '2019-08-01' and '2019-08-30';
这两个查询返回的结果都为零,我希望插入数据库的值何时显示?
这里有一个sql小提琴:http://sqlfiddle.com/#!17/11842/2
最佳答案
'start'
是字符串文本(常量),而不是列引用。查询是比较字符串(varchar)值'start'
和字符串值'2019-08-01 00:00:00'
如果运行以下命令,您可以自己查看:
select 'start' BETWEEN '2019-08-01 00:00:00' and '2019-08-30 00:00:00';
您需要删除
'start'
周围的单引号以使其成为列引用:select *
from the_table
where start BETWEEN '2019-08-01 00:00:00' and '2019-08-30 00:00:00';
这是一个很好的例子,为什么用适当的数据类型提供常量值有助于编写更好的语句。如果您使用了真正的时间戳常量(而不是字符串),Postgres将拒绝比较这些值:
select 'start' BETWEEN timestamp '2019-08-01 00:00:00' and timestamp '2019-08-30 00:00:00'
导致错误。
注意,对于时间戳值,通常最好避免使用BETWEEN运算符。我想您的查询应该包括8月30日的行,而您当前的查询没有。最好写成:
where start >= timestamp '2019-08-01 00:00:00'
and start < timestamp '2019-09-01 00:00:00'
关于postgresql - 如何使用类型为timestamptz的字段在postgres中选择两个日期之间的所有条目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57369962/