提问人:David542 提问时间:6/20/2023 最后编辑:David542 更新时间:6/21/2023 访问量:48
比较各种日期/时间类型
Comparing various date/time types
问:
它是否定义了如何将日期与带时区的时间戳或不带时区的时间戳进行比较?例如,类似以下内容:
SELECT
DATE '2014-01-01' = TIMESTAMP WITH TIME ZONE '2014-01-01',
DATE '2014-01-01' = TIMESTAMP WITHOUT TIME ZONE '2014-01-01',
TIMESTAMP WITH TIME ZONE '2014-01-01' = TIMESTAMP WITHOUT TIME ZONE '2014-01-01'
我见过各种实现,有些是错误的,有些是允许的。例如,Postgres 允许同时使用这三种方法,而 BigQuery 只允许将日期与时间戳进行比较,而不使用时区。
我的想法是,日期并不一定意味着当天的时间是——例如,如果一集的电视播出日期是 2023 年 7 月 1 日,这并不一定意味着播出日期是 UTC 午夜。所以我认为从最严格的意义上讲,相等在各种日期/时间类型中没有意义(就像在各种数字类型中一样)。00:00:00
答:
1赞
jarlh
6/21/2023
#1
国际标准化组织/国际电工委员会 9075-2:2023(E)
5.3 <文字>
<timestamp literal> ::=
TIMESTAMP <timestamp string>
<timestamp string> ::=
<quote> <unquoted timestamp string> <quote>
<unquoted timestamp string> ::=
<unquoted date string> <space> <unquoted time string>
<unquoted date string> ::=
<date value>
<unquoted time string> ::=
<time value> [ <time zone interval> ]
<time zone interval> ::=
<sign> <hours value> <colon> <minutes value>
这意味着 TIMESTAMP 文字可以如下所示
TIMESTAMP'2023-06-21 08:03:33'
TIMESTAMP'2023-06-21 08:03:33.123'
TIMESTAMP'2023-06-21 08:03:33+10:00'
4.6 日期时间和间隔
仅当 datetime 类型的项具有相同的主 datetime 字段>时,它们才具有可比<。
即 TIMESTAMP 和 DATE 没有可比性,因为它们没有相同的主 datetime 字段。
<primary datetime field> ::=
<non-second primary datetime field>
| SECOND
<non-second primary datetime field> ::=
YEAR
| MONTH
| DAY
| HOUR
| MINUTE
评论
0赞
David542
6/21/2023
我明白了,感谢您的澄清。那么 postgres 做事的方式是完全非标准的吗?也许这会混淆数据类型和文字值:docs.oracle.com/cd/B19306_01/server.102/b14225/......
0赞
David542
6/21/2023
比较定义是否允许比较 A 和 Then?即,两个时间戳,一个有时区,一个没有?DATETIME
TIMESTAMP
0赞
jarlh
6/21/2023
是的,您可以比较两个时间戳,一个有时区,另一个没有时区。
评论