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;
您好,我在 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;