从 unix_time yyyy-MM-dd HH:mm:ss 计算 start_time 和 end_time 之间的差异(以秒为单位)

Posted

技术标签:

【中文标题】从 unix_time yyyy-MM-dd HH:mm:ss 计算 start_time 和 end_time 之间的差异(以秒为单位)【英文标题】:Calculate difference between start_time and end_time in seconds from unix_time yyyy-MM-dd HH:mm:ss 【发布时间】:2019-08-14 14:43:16 【问题描述】:

我仍在学习 SQL,我在 SQL Server 或 Postgreы 上找到了一些解决方案,但在 HUE 上似乎不起作用 DATEDIFF,只允许我计算天数之间的差异 秒,分钟不可用。非常欢迎帮助。

我能够用substring_index 拆分时间戳,但是我找不到正确的方法来比较 start_time 并将其减去 end_time 以获得准确的秒数。我找不到时间函数,所以我假设我应该根据时间戳计算它。获得为

from_unixtime(unix_timestamp(start_time, "yyyy-MM-dd'T'HH:mm:ss.SSSSSS"), 'yyyy-MM-dd HH:mm:ss')


substring_index(start_time, 'T', -1)s_tm,
substring_index(end_time, 'T', -1)e_tm


start_date 2018-06-19 13:59:41  
end_date   2018-06-19 14:01:17

想要的输出

01:36

【问题讨论】:

【参考方案1】:

Hive 解决方案。

以秒为单位的差异:

select UNIX_TIMESTAMP('2018-06-19T14:01:17.000000',"yyyy-MM-dd'T'HH:mm:ss.SSSSSS")-
   UNIX_TIMESTAMP('2018-06-19T13:59:41.000000',"yyyy-MM-dd'T'HH:mm:ss.SSSSSS") as seconds_diff

结果:

96

现在计算 HH:mm:ss 的差异:

select concat_ws(':',lpad(floor(seconds_diff/3600),2,'0'),        --HH
                     lpad(floor(seconds_diff%3600/60),2,'0'),     --mm
                     lpad(floor(seconds_diff%3600%60),2,'0')      --ss
       )

from
(
select --calculate seconds difference
       UNIX_TIMESTAMP('2018-06-19T14:01:17.000000',"yyyy-MM-dd'T'HH:mm:ss.SSSSSS")-
       UNIX_TIMESTAMP('2018-06-19T13:59:41.000000',"yyyy-MM-dd'T'HH:mm:ss.SSSSSS") as seconds_diff
) s

结果:

OK
00:01:36
Time taken: 1.071 seconds, Fetched: 1 row(s)

另请参阅有关格式转换的答案:https://***.com/a/23520257/2700344

【讨论】:

谢谢,但这样我得到所有行相同的结果,如果我尝试将日期替换为 column_name,如下所示是行不通的。不确定我是否缺少明显的东西... from_unixtime(UNIX_TIMESTAMP(end_time)-UNIX_TIMESTAMP(start_time),'mm:ss') @user11925123 如果它为 NULL,那么格式很可能与您的示例不同:2018-06-19 13:59:41。这就是为什么我给了你关于格式转换的答案的链接。您只需为 UNIX_TIMESTAMP 指定正确的格式作为第二个参数 嘿嘿,原来的格式是“yyyy-MM-dd'T'HH:mm:ss.SSSSSS”。当我使用 from_unixtime(unix_timestamp(end_time, "yyyy-MM-dd'T'HH:mm:ss.SSSSSS"), 'mm')-from_unixtime(unix_timestamp(start_time, "yyyy-MM-dd'T'HH: mm:ss.SSSSSS"), 'mm') 如果结束时间和开始时间相同,它会起作用,但是当结束时间像 17:16:04 和开始时间是 16:58:05 时,减法不正确。如果我尝试使用 HH:MM 而不仅仅是 MM,那么我会得到空值。有小费吗?提前致谢。 @user11925123 是的,格式转换很奇怪。使用显式数学。 @substract 秒,然后计算 HH, mm, ss。查看固定答案

以上是关于从 unix_time yyyy-MM-dd HH:mm:ss 计算 start_time 和 end_time 之间的差异(以秒为单位)的主要内容,如果未能解决你的问题,请参考以下文章

如何从日期格式“yyyy-MM-dd'T'HH:mm:ss.SSSZ”中分别获取日期、年份、小时、分钟?

如何快速转换日期 yyyy-mm-dd'T'HH:mm:ss.SSSZ [重复]

变异时间 (HH:MM:SS) 到日期 (YYYY-MM-DD) 占 R 中的午夜

如何将日期时间从 PowerShell 输出转换为 yyyy-MM-dd HH:mm:ss 格式

Objective-C dateformatter。 yyyy-MM-dd hh:mm:ss改为yyyy-MM-dd

Hive 从 csv 导入字符串日期为“yyyy-mm-dd HH:MM:SS”作为时间戳