相似的发音表达式CURRENT_DATE
和CURRENT_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:00
将date
强制回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小时).