【问题标题】:hour() function of excel in postgres (equivalent)postgres中excel的hour()函数(等效)
【发布时间】:2018-08-15 17:16:05
【问题描述】:

我最近在使用 postgres,我必须进行一些计算。但是我一直无法模仿 Excel 的 HOUR() 函数,我阅读了official information 但对我没有多大帮助。

该函数接收一个小数并获得相同的小时、分钟和秒,例如十进制0,99988426返回11:59:50。尝试使用 to_timestamp 函数在 postgres(我使用 PostgreSQL 10.4)中执行此操作: select to_char (to_timestamp (0.99988426), 'HH24: MI: SS');本次返程时间为 19:00:00。当然我省略了一些东西,关于如何解决这个问题的一些想法?

【问题讨论】:

    标签: postgresql excel-formula equivalent


    【解决方案1】:
    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';
    

    【讨论】:

    • +1。可以直接去天区间SELECT TO_CHAR(0.99988426 * '1 day'::interval, 'HH24:MI:SS');
    • 感谢您的详细解释,现在我知道这是如何工作的了。问候
    【解决方案2】:

    有两个主要区别需要处理:

    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)
    

    【讨论】:

    • while Postgres sets it at 19h 呃……什么?
    • @leonbloy select to_char (to_timestamp (0), 'HH24: MI: SS') --> 19:00
    • 这个答案是错误的。 to_timestamp (0) 返回 Unix 纪元的开始时间 (1 January 1970, 00:00:00) 。这个食谱得到了正确的答案,因为它使用了一个特定的时区 (GMT-4)。依赖它是不好的做法。我在我的时区得到了不同的结果select to_char (to_timestamp (0), 'HH24: MI: SS') --> 21h00
    • 修复这个答案:select (to_timestamp (0.99988426*86400) AT TIME ZONE 'UTC' )::time
    • 非常感谢您的回复。我知道我需要乘以一个值,但我不知道 que valor。
    猜你喜欢
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    相关资源
    最近更新 更多