postgresql 带日期时间的BETWEEN

jucafojl  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(3)|浏览(169)

我使用PostgreSQL 8.4.11并得到一个奇怪的错误。当我查询时:

SELECT "documents_document"."given_on" 
FROM "documents_document" 
WHERE (EXTRACT('month' FROM "documents_document"."given_on") = 1
       AND "documents_document"."given_on" 
       BETWEEN '1-01-01 00:00:00' and '1-12-31 23:59:59.999999') 
ORDER BY "documents_document"."created_on" DESC

字符串
我得到的结果:

given_on  
------------
 2002-01-16
 2011-01-25
 2012-01-12
 2012-01-12
 2012-01-12
 2012-01-20
 2012-01-19
 2012-01-13
 2012-01-31
 2012-01-16
 2012-01-31
 2012-01-12
 ...


为什么?为什么?
我希望日期是1-01-01... 1-12-31.

ztyzrc3y

ztyzrc3y1#

您期望的日期 “在时间间隔1-01-01... 1-12-31”
但是PostgreSQL怎么知道你的意思呢?
输入字符串文字根据当前会话的设置进行解释(除非被否决,否则默认为postgressql.conf中的常规设置)。特别是datestyle
DateStylestring
设置日期和时间值的显示格式,以及解释不明确的日期输入值的规则。由于历史原因,此变量包含两个独立的分量:输出格式规范(ISOPostgresSQLGerman)和年/月/日排序的输入/输出规范(DMYMDYYMD)。这些可以单独设置或一起设置。关键字EuroEuropeanDMY的同义词;关键字USNonEuroNonEuropeanMDY的同义词。有关详细信息,请参阅Section 8.5。内置默认值是ISO, MDY,但是initdb将使用与所选lc_time区域设置的行为相对应的设置来初始化配置文件。
(而输出格式主要由lc_time决定。)
在你的例子中,残缺的时间戳文字1-12-31 23:59:59显然被解释为:

D-MM-YY h24:mi:ss

字符串
虽然你希望:

Y-MM-DD h24:mi:ss

3个选项

1.设置datestyle,使其以与您相同的方式解释文字。可能是ISO, YMD
1.使用to_timestamp()以一种定义良好的方式解释字符串文字-独立于其他设置。好多了

SELECT to_timestamp('1-12-31 23:59:59', 'Y-MM-DD h24:mi:ss');


1.更好的是,对所有日期时间文字使用ISO 8601格式YYYY-MM-DD)。这是明确和独立于任何设置

SELECT '2001-12-31 23:59:59'::timestamp;

重写查询

你的问题一开始就有问题。以不同的方式处理范围查询。喜欢的:

SELECT d.given_on 
FROM   documents_document d
WHERE  EXTRACT('month' FROM d.given_on) = 1
AND    d.given_on >= '2001-01-01 0:0'
AND    d.given_on <  '2002-01-01 0:0'
ORDER  BY d.created_on DESC;


或者更简单的说:

SELECT d.given_on 
FROM   documents_document d
WHERE  d.given_on >= '2001-01-01'
AND    d.given_on <  '2001-02-01'
ORDER  BY d.created_on DESC;


'2001-02-01'是完全有效的时间戳输入。请参阅:

  • 在PostgreSQL中生成两个日期之间的时间序列

PostgreSQL 9.2或更高版本中的Range types可能会感兴趣。

zbwhf8kr

zbwhf8kr2#

SELECT '1-12-31 23:59:59.999999'::timestamp;返回2031-01-12 23:59:59.999999,显然Postgres没有考虑将没有世纪的年份作为日期的第一个元素。

v09wglhw

v09wglhw3#

你没说要什么格式。所以它返回了原生格式。也许你甚至认为每个人都像你一样表示时间?看看可能的格式。http://www.postgresql.org/docs/8.2/static/functions-formatting.html

相关问题