PostgreSQL有效时间戳格式及特殊日期值合法性咨询
PostgreSQL 无时区时间戳的有效性规则说明
一、基础规则
PostgreSQL的timestamp without time zone类型遵循真实日历逻辑,输入值必须符合合法的日期时间范围,否则会判定为无效(除非开启宽松模式自动修正)。
二、2000-99-00是否有效?
完全无效,两个部分都不符合规则:
- 月份
99远远超出了合法的1-12范围; - 日期
00也不合法,不存在“0号”日期,合法日期是对应月份的实际天数(比如1月1-31,2月最多29天等)。
三、月份和日期的合法范围
- 月份:固定是
01到12(不带前导零的1-12也可以),超出这个范围的数值直接导致时间戳无效。 - 日期:不是固定的01-31,得看对应月份和年份的实际天数:
- 大月(1、3、5、7、8、10、12月):1-31日
- 小月(4、6、9、11月):1-30日
- 2月:平年1-28日,闰年1-29日(闰年判断:能被4整除但不能被100整除,或者能被400整除)
补充:宽松输入的自动修正
PostgreSQL默认允许一些“不严谨”的日期输入,比如2000-02-30会被自动转成2000-03-01,但这是系统的自动修正,不代表原输入是合法的。如果需要严格校验,可设置datestyle = 'ISO, strict',此时非法日期会直接报错。
内容的提问来源于stack exchange,提问作者Denys TDV
相关产品推荐
相关产品推荐

