Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将毫秒转换为DDDD:HH:mm:ss时发生配置单元/SQL错误_Sql_Hive_Timestamp_Hiveql_Unix Timestamp - Fatal编程技术网

将毫秒转换为DDDD:HH:mm:ss时发生配置单元/SQL错误

将毫秒转换为DDDD:HH:mm:ss时发生配置单元/SQL错误,sql,hive,timestamp,hiveql,unix-timestamp,Sql,Hive,Timestamp,Hiveql,Unix Timestamp,我有一个以毫秒为单位的输出,它太大了,无法用HH:mm:ss格式描述,我需要扩展到DDDD:HH:mm:ss 我目前使用的代码仅适用于大数字: select from_unixtime(cast(floor(2513702864/1000) as bigint), 'DDDD:HH:mm:ss'); 给出:0030:02:15:02,这是正确的 select from_unixtime(cast(floor(17259/1000) as bigint), 'DDDD:HH:mm:ss');

我有一个以毫秒为单位的输出,它太大了,无法用HH:mm:ss格式描述,我需要扩展到DDDD:HH:mm:ss

我目前使用的代码仅适用于大数字:

select from_unixtime(cast(floor(2513702864/1000) as bigint), 'DDDD:HH:mm:ss');
给出:0030:02:15:02,这是正确的

select from_unixtime(cast(floor(17259/1000) as bigint), 'DDDD:HH:mm:ss');
给出:0001:00:00:17,这不正确

select from_unixtime(cast(floor(127259/1000) as bigint), 'DDDD:HH:mm:ss');
给出:0001:00:02:07,这也不正确

select from_unixtime(cast(floor(127259/1000) as bigint), 'DDDD:HH:mm:ss');

当处理较小的毫秒时,如何修复DDDD部分中错误的1?

逻辑很简单。BIGINT timestamp是从Unix历元(1970-01-01 00:00:00 UTC)传递的秒数或毫秒数

要获取毫秒部分,请使用
(ts%1000)
-除以1000后返回提醒

要获得传递的总整秒数,请使用
(ts div 1000)
-返回整数部分,所有其他数字将根据该数字计算:天、小时、分钟、秒

天数:
(ts div 1000)div 86400
-返回总秒数除以一天中秒数后的整数部分

要获取全天计算后剩余的小时数:在天计算后获取提醒
((ts div 1000)%86400)
并除以小时中的秒数,获取整数部分
((ts div 1000)%86400)div 3600)

等等

演示:

结果:

1 29:02:15:02.864 --29 whole days, 2 hours, 15 minutes, 2 seconds, 864 millis
2 0:00:00:17.259 --17 whole seconds and 259 millis
3 0:00:02:07.259 --two whole minutes, 7 seconds and 259 millis
4 0:00:00:01.272 --one whole second and millis
5 0:00:00:00.127 --we have only milliseconds
1970-01-30 02:15:02.864
现在您可以看到此计算结果与_unixtime返回的结果之间的差异。 对于记录id=1,整个天数为29天。为什么from_unixtime返回30(对于'D')?因为整整29天过去了,我们在新的30天里有2小时15分2秒864英里。换句话说,from_unixtime返回格式化的时间戳,而查询中的计算返回格式化的间隔,“一年中的一天”和“从中经过的整天”是不同的

希望,现在是晴朗的一天

另见类似问题:

如果需要将以毫秒为单位的bigint时间戳转换为保留毫秒的字符串(
yyyy-MM-dd HH:MM:ss.SSS
),请使用以下命令:

select concat(from_unixtime(ts div 1000), '.', (ts  % 1000)) as timestamp_with_millis
  from (select bigint(2513702864)  as ts) s
结果:

1 29:02:15:02.864 --29 whole days, 2 hours, 15 minutes, 2 seconds, 864 millis
2 0:00:00:17.259 --17 whole seconds and 259 millis
3 0:00:02:07.259 --two whole minutes, 7 seconds and 259 millis
4 0:00:00:01.272 --one whole second and millis
5 0:00:00:00.127 --we have only milliseconds
1970-01-30 02:15:02.864

请解释最初的任务。不清楚你在做什么。DDDD是什么意思,为什么是四个D???一年有365天。。。总有那么一天:今天,昨天,明天,如果你按照你的模式,它将是一年中的某一天,而不是零。因为函数返回时间戳格式,所以我只想以天+小时+彩信+秒为单位显示毫秒。现在,当你解释一年中的一天时,它现在是有意义的,因为1只是一年中的一天,但我只是尝试将毫秒转换为天,而不将其定义为一年中的一天。如果超过十年,天数可以超过365天。有没有一种方法可以直接转换为天而不使用年?@leftjoin你认为有什么解决方法吗?你是最好的!