比较各种日期/时间类型

Comparing various date/time types

提问人:David542 提问时间:6/20/2023 最后编辑:David542 更新时间:6/21/2023 访问量:48

问:

它是否定义了如何将日期与带时区的时间戳或不带时区的时间戳进行比较?例如,类似以下内容:

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

ANSI-SQL 数据库-不可知

评论

0赞 Nick.Mc 6/20/2023
如果它在任何地方定义,我想它会在 ISO 标准中
0赞 David542 6/20/2023
@Nick.McDermaid SQLServer 是否支持在不显式强制转换的情况下比较各种不同的日期/时间类型?
1赞 Nick.Mc 6/20/2023
是的。但它总是隐含地将他们投射到幕后。这显示了哪些数据类型可以隐式转换,哪些数据类型会引发错误 learn.microsoft.com/en-us/sql/t-sql/data-types/...。不过,我不确定它投射了哪个 wau。
1赞 jarlh 6/20/2023
您的 TIMESTAMP 文字都是无效的。而且您无法将日期与时间戳进行比较。(根据 ANSI SQL。
1赞 The Impaler 6/20/2023
不幸的是,大多数数据库都实现了不同的日期和时间数据类型,不同的算术,并且它们也有奇怪的怪癖(MySQL因此而臭名昭著)。你不会为它们找到“与数据库无关”的逻辑。

答:

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?即,两个时间戳,一个有时区,一个没有?DATETIMETIMESTAMP
0赞 jarlh 6/21/2023
是的,您可以比较两个时间戳,一个有时区,另一个没有时区。