postgres 中 excel 的 hour() 函数(等效)
hour() function of excel in postgres (equivalent)
我最近在使用 postgres,我必须做一些计算。然而我一直没能模仿Excel的HOUR()函数,我看了official information但是对我帮助不大
函数接收一个小数,得到小数的时分秒,例如小数0,99988426returns11:59:50。尝试使用 to_timestamp 函数在 postgres(我使用 PostgreSQL 10.4)中执行此操作:select to_char (to_timestamp (0.99988426), 'HH24: MI: SS');这 return 19:00:00。我当然遗漏了一些关于如何解决这个问题的想法?
有两个主要区别需要处理:
Excel不考虑时区。序列日期 0 从 0h00 开始,但 Postgres 使用时区使其变为 19h。您需要在 Postgres 结果中使用 UTC 才能与 Excel.
中的结果相同
select to_char (to_timestamp (0), 'HH24: MI: SS'),to_char (to_timestamp (0) AT TIME ZONE 'UTC', 'HH24: MI: SS');
to_char | to_char
------------+------------
19: 00: 00 | 00: 00: 00
Excel 认为 1 是一天,而 Postgres 认为 1 是 1 秒。要获得相同的行为,请将您的数字乘以 86400,即一天中的秒数
select to_char (to_timestamp (0.99988426*86400) AT TIME ZONE 'UTC', 'HH24: MI: SS');
to_char
------------
23: 59: 50
(1 row)
24:00:00 or 86400 seconds = 1
Half day(12:00 noon) or 43200 seconds = 43200/86400 = 0.5
11:59:50 or 86390 seconds = 86390/86400 = 0.99988426
因此,要将您的十进制值转换为时间,您只需将其乘以 86400 即可得到秒数,并通过以下方式将其转换为您的格式:
SELECT TO_CHAR((0.99988426 * 86400) * '1 second'::interval, 'HH24:MI:SS');
SELECT (0.99988426 * 86400) * interval '1 sec';
我最近在使用 postgres,我必须做一些计算。然而我一直没能模仿Excel的HOUR()函数,我看了official information但是对我帮助不大
函数接收一个小数,得到小数的时分秒,例如小数0,99988426returns11:59:50。尝试使用 to_timestamp 函数在 postgres(我使用 PostgreSQL 10.4)中执行此操作:select to_char (to_timestamp (0.99988426), 'HH24: MI: SS');这 return 19:00:00。我当然遗漏了一些关于如何解决这个问题的想法?
有两个主要区别需要处理:
Excel不考虑时区。序列日期 0 从 0h00 开始,但 Postgres 使用时区使其变为 19h。您需要在 Postgres 结果中使用 UTC 才能与 Excel.
中的结果相同select to_char (to_timestamp (0), 'HH24: MI: SS'),to_char (to_timestamp (0) AT TIME ZONE 'UTC', 'HH24: MI: SS');
to_char | to_char
------------+------------
19: 00: 00 | 00: 00: 00
Excel 认为 1 是一天,而 Postgres 认为 1 是 1 秒。要获得相同的行为,请将您的数字乘以 86400,即一天中的秒数
select to_char (to_timestamp (0.99988426*86400) AT TIME ZONE 'UTC', 'HH24: MI: SS');
to_char
------------
23: 59: 50
(1 row)
24:00:00 or 86400 seconds = 1
Half day(12:00 noon) or 43200 seconds = 43200/86400 = 0.5
11:59:50 or 86390 seconds = 86390/86400 = 0.99988426
因此,要将您的十进制值转换为时间,您只需将其乘以 86400 即可得到秒数,并通过以下方式将其转换为您的格式:
SELECT TO_CHAR((0.99988426 * 86400) * '1 second'::interval, 'HH24:MI:SS');
SELECT (0.99988426 * 86400) * interval '1 sec';