嗨,我在postgresql中使用了cast函数,其中有一个bigint类型的dayhour列,它包含格式为yyyymmddhh的时间戳(例如2020051912)所以,实际上我只需要varchar类型中该字段的yyyymmdd(例如20200519)。做 CAST(dayhour AS VARCHAR(8)) 缩短日期和时间,并且始终只使用“yyyymmdd”?你知道更好的方法吗?编辑:我知道我也可以使用子字符串函数,但想知道这是否像使用子字符串函数一样安全。。。
CAST(dayhour AS VARCHAR(8))
eqqqjvef1#
为什么不自己试试呢?我是为你做的。似乎这是可能的,虽然这是一个有点奇怪的方式如何做子串。。。甚至可以将字符串转换为时间戳。
select cast(2020051912::bigint as varchar(8)); select cast('2020051912' as varchar(8)); select cast(2020051912::bigint as varchar(8))::timestamp;
pgx2nnw82#
你可以用 cast() . 我认为 left() 意图更明确:
cast()
left()
select left(dayhour::text, 6)
或者,因为这是一个数字:
select floor(dayhour / 100)
(the) floor() 是多余的,因为postgres做整数除法,但我喜欢小心。)我鼓励你使用适当的 date 价值观。postgres可以轻松地将其转换为日期:
floor()
date
select left(dayhour::text, 6)::date
或者,将值存储为 timestamp 并使用 check 要确保正好是一小时:
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)
2条答案
按热度按时间eqqqjvef1#
为什么不自己试试呢?我是为你做的。
似乎这是可能的,虽然这是一个有点奇怪的方式如何做子串。。。
甚至可以将字符串转换为时间戳。
pgx2nnw82#
你可以用
cast()
. 我认为left()
意图更明确:或者,因为这是一个数字:
(the)
floor()
是多余的,因为postgres做整数除法,但我喜欢小心。)我鼓励你使用适当的
date
价值观。postgres可以轻松地将其转换为日期:或者,将值存储为
timestamp
并使用check
要确保正好是一小时:可以添加一个计算列,将其表示为bigint: