上海当前时间2024—03—19 00:43

show timezone
+----------+
| TimeZone |
|----------|
| GMT      |
+----------+

SELECT CURRENT_DATE  AT TIME ZONE 'Asia/Shanghai', CURRENT_TIME  AT TIME ZONE 'Asia/Shanghai', CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Shanghai';
 
+---------------------+-----------------------+---------------------------+
| timezone            | timezone              | timezone                  |
|---------------------+-----------------------+---------------------------|
| 2024-03-18 08:00:00 | 00:43:52.916370+08:00 | 2024-03-19 00:43:52.91637 |
+---------------------+-----------------------+---------------------------+
  1. 为什么当前_TIMESTAMP的日期与Postgr中的当前_date不同?
  2. 如果时区是GMT,我如何获得结果'2024—03—19'在上海的当前日期?

推荐答案

相似的发音表达式CURRENT_DATECURRENT_TIMESTAMP在本质上是非常不同的.

CURRENT_TIMESTAMP返回数据类型timestamptz(timestamp with time zone),并且不依赖于本地设置.(只有display,但它总是在同一个时间点上有不同的偏移.当您应用AT TIME ZONE construct时,您会生成给定时区的相应本地timestamp(timestamp without time zone).世界时间的同一点.

CURRENT_DATE返回数据类型date,并取决于会话的当前设置timezone.是本地时间戳truncated到日期.这种截断引入了差异,其数量取决于当前timezone的设置.当应用AT TIME ZONE构造时,在为给定时区生成timestamptz之前,用时间分量00:00date强制回timestamp(具体化通过较早截断而产生的差异).现在是世界时间的另一个点!

CURRENT_TIME返回可疑类型timetz(time with time zone).这个函数和数据类型都包含在SQL标准中,但在Postgr中不鼓励使用(或者一般来说,真的)."时间与时区"的概念本质上是模糊的.想想夏令时或历史变迁.我从来不使用timetz.(也不是CURRENT_TIME)

相关内容:

如果上海目前的timestamp'2024-03-19 01:29',那么根据日期是什么?我只需要得到'2024-03-19'.

考虑一下demo:

SELECT -- current date of the given timestamp (we only know from context that it applies to Shanghai!)
       (timestamp '2024-03-19 01:29')::date
       -- date in Shanghai for a given time in London
     , (timestamp '2024-03-19 01:29' AT TIME ZONE 'Europe/London' AT TIME ZONE 'Asia/Shanghai')::date
       -- date in London for a given time in Shanghai
     , (timestamp '2024-03-19 01:29' AT TIME ZONE 'Asia/Shanghai' AT TIME ZONE 'Europe/London')::date
       -- date in Shanghai for the given point in time (timestamptz)
     , (timestamptz '2024-03-18 18:29:00+01' AT TIME ZONE 'Asia/Shanghai')::date
       -- date in London for the given point in time (timestamptz)
     , (timestamptz '2024-03-18 19:29:00+02' AT TIME ZONE 'Europe/London')::date
;
d1 d2 d3 d4 d5
2024-03-19 2024-03-19 2024-03-18 2024-03-19 2024-03-18

请注意,'2024-03-18 18:29:00+01''2024-03-18 19:29:00+02'只是同一时间点的两个不同的文本表示形式(时间戳晚1小时,时间偏移量大1小时).

Sql相关问答推荐

Postgresql:从jsons数组到单个id索引的json

基于时间的SQL聚合

SQL使最终结果显示两个表后的所有数据(匹配和不匹配)?

LEFT JOIN不显示计数0我期望的方式

BigQuery-当子查询不返回任何结果时,所有结果为零

在SQL中返回缺省值,即使查询不返回任何结果

SQL:如果一个表中的日期在另一个表的日期的12个月内,则为是或否

使用递归CTE在BigQuery中获取文件路径

按行值出现的顺序对行值进行分组

在 R 值的 SQL 块中显示值

如何 for each id创建长度等于id长度的不同日期序列?

BigQuery导航函数计算ID

PostgreSQL:通过数组的元素从另一个表中 Select 数据,然后按顺序显示

在多个表上递归查找

如何按日期和位置对最近 3 个报告日期的 SQL 查询结果进行透视?

字符串从更改到表列和查询中的一行的转换错误

BigQuery - 将 TIMESTAMP 转换为 HH:MM:SS,然后识别 TIME_DIFF

创建一个将层次 struct 级别放入列中的查询

Oracle SQL 查询自行运行,但在包装到select count(*) from ()时失败

Amazon Redshift - 子计划的哈希表不存在