我使用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.
3条答案
按热度按时间ztyzrc3y1#
您期望的日期 “在时间间隔1-01-01... 1-12-31”。
但是PostgreSQL怎么知道你的意思呢?
输入字符串文字根据当前会话的设置进行解释(除非被否决,否则默认为
postgressql.conf
中的常规设置)。特别是datestyle
:DateStyle
(string
)设置日期和时间值的显示格式,以及解释不明确的日期输入值的规则。由于历史原因,此变量包含两个独立的分量:输出格式规范(
ISO
、Postgres
、SQL
或German
)和年/月/日排序的输入/输出规范(DMY
、MDY
或YMD
)。这些可以单独设置或一起设置。关键字Euro
和European
是DMY
的同义词;关键字US
、NonEuro
和NonEuropean
是MDY
的同义词。有关详细信息,请参阅Section 8.5。内置默认值是ISO, MDY
,但是initdb将使用与所选lc_time
区域设置的行为相对应的设置来初始化配置文件。(而输出格式主要由
lc_time
决定。)在你的例子中,残缺的时间戳文字
1-12-31 23:59:59
显然被解释为:字符串
虽然你希望:
型
3个选项
1.设置
datestyle
,使其以与您相同的方式解释文字。可能是ISO, YMD
?1.使用
to_timestamp()
以一种定义良好的方式解释字符串文字-独立于其他设置。好多了型
1.更好的是,对所有日期时间文字使用ISO 8601格式(
YYYY-MM-DD
)。这是明确和独立于任何设置。型
重写查询
你的问题一开始就有问题。以不同的方式处理范围查询。喜欢的:
型
或者更简单的说:
型
'2001-02-01'
是完全有效的时间戳输入。请参阅:PostgreSQL 9.2或更高版本中的Range types可能会感兴趣。
zbwhf8kr2#
SELECT '1-12-31 23:59:59.999999'::timestamp;
返回2031-01-12 23:59:59.999999
,显然Postgres没有考虑将没有世纪的年份作为日期的第一个元素。v09wglhw3#
你没说要什么格式。所以它返回了原生格式。也许你甚至认为每个人都像你一样表示时间?看看可能的格式。http://www.postgresql.org/docs/8.2/static/functions-formatting.html