CAST 总是从头开始截断字符串吗?

does CAST cut a string from the beggining always?

您好,我在 PostgreSQL 中使用了一个名为 dayhour 的 BIGINT 类型的列,其中包含 YYYYMMDDHH 格式的时间戳(例如 2020051912)

因此,实际上我只需要该字段的 YYYYMMDD(例如 20200519),例如 varchar 类型。

是否 CAST(dayhour AS VARCHAR(8)) 削减日期和时间并且总是只需要 'YYYYMMDD'?

你知道更好的方法吗?

编辑:我知道我也可以使用 SUBSTRING 函数,但想知道这是否与使用 SUBSTRING 函数一样安全...

您可以使用 cast()。我认为 left() 的意图更清楚:

select left(dayhour::text, 6)

或者,因为这是一个数字:

select floor(dayhour / 100)

floor() 是多余的,因为 Postgres 做整数除法,但我喜欢小心。)

我鼓励您使用正确的 date 值。 Postgres 可以轻松地将其转换为日期:

select left(dayhour::text, 6)::date

或者,将值存储为 timestamp 并使用 check 约束以确保它正好是一个小时:

check (dayhour = date_trunc('hour', dayhour))

您可以添加计算列以将其表示为 bigint:

alter table t add column day_hour_bigint bigint generated always as 
    (to_char(dayhour, 'YYYYMMDDHH24')::bigint)

为什么不自己试试呢? I did it for you.

似乎是可能的,尽管如何做子字符串有点奇怪...

连时间戳都可以投字符串

select cast(2020051912::bigint as varchar(8));
select cast('2020051912' as varchar(8));
select cast(2020051912::bigint as varchar(8))::timestamp;