Hive:在 "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 中转换缺少秒数的字符串日期时间
Hive: Convert string datetime with missing seconds in "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
我正在使用以下代码将字符串日期时间变量转换为日期时间,但转换后的字符串缺少 SSS 部分。
使用的代码:
cast(FROM_UNIXTIME(UNIX_TIMESTAMP(oldtime, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"),"yyyy-MM-dd HH:mm:ss.SSS") as timestamp) as newtime
结果:
2019-03-08T18:28:36.901Z 转换为 08MAR2019:18:28:36.000000
字符串中的其他一些旧时光:
2020-03-09T16:05:06:827Z
2020-03-09T16:03:19:354Z
2020-03-11T16:03:57:280Z
2020-03-10T16:02:57:642Z
2020-03-10T16:04:07:455Z
2020-03-10T16:04:09:737Z
2020-03-10T16:03:57:280Z
2020-03-10T16:02:46:816Z
转换后的时间中缺少 SSS 部分“901”。需要帮助保留 SSS 部分,因为我需要按准确时间对记录进行排序。
谢谢!
from_unixtime
总是在 分钟 (yyyy-MM-dd HH:mm:ss)
之前得到 millisecs
我们需要做一些变通办法。
- 我们将使用
regexp_extract
从 old_time 中提取 millisecs
然后 concat
到 from_unixtime
结果并最终转换为 timestamp
.
Example:
select old_time,
timestamp(concat_ws(".", --concat_ws with . and cast
FROM_UNIXTIME(UNIX_TIMESTAMP(old_time, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"),"yyyy-MM-dd HH:mm:ss"), -- from_unixtime and unix_timestamp to convert without millisecs
regexp_extract(string(old_time),".+\.(.*)(?i)z",1))) as newtime from --regexp_extract to extract last 3 digits before z then concat
(select string("2020-03-11T21:14:41.335Z")old_time)e
+------------------------+-----------------------+
|old_time |newtime |
+------------------------+-----------------------+
|2020-03-11T21:14:41.335Z|2020-03-11 21:14:41.335|
+------------------------+-----------------------+
UPDATE:
您的示例数据在毫秒之前有 :
,请尝试以下查询:
select old_time,
timestamp(concat_ws(".", --concat_ws with . and cast
FROM_UNIXTIME(UNIX_TIMESTAMP(old_time, "yyyy-MM-dd'T'HH:mm:ss:SSS'Z'"),"yyyy-MM-dd HH:mm:ss"), -- from_unixtime and unix_timestamp to convert without millisecs
regexp_extract(string(old_time),".+\:(.*)(?i)z",1))) as newtime from --regexp_extract to extract last 3 digits before z then concat
(select string("2020-03-11T21:14:41:335Z")old_time)e
只需将 'T'
替换为 space ' '
删除 'Z'
并将最后的 ':'
替换为点,如下所示:
select regexp_replace('2020-03-09T16:05:06:827Z','(.*?)T(.*?):([^:]*?)Z$',' \.');
结果:
2020-03-09 16:05:06.827
如果您需要转换为不同的格式并保留毫秒,另请阅读此答案:
我正在使用以下代码将字符串日期时间变量转换为日期时间,但转换后的字符串缺少 SSS 部分。
使用的代码:
cast(FROM_UNIXTIME(UNIX_TIMESTAMP(oldtime, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"),"yyyy-MM-dd HH:mm:ss.SSS") as timestamp) as newtime
结果:
2019-03-08T18:28:36.901Z 转换为 08MAR2019:18:28:36.000000
字符串中的其他一些旧时光:
2020-03-09T16:05:06:827Z
2020-03-09T16:03:19:354Z
2020-03-11T16:03:57:280Z
2020-03-10T16:02:57:642Z
2020-03-10T16:04:07:455Z
2020-03-10T16:04:09:737Z
2020-03-10T16:03:57:280Z
2020-03-10T16:02:46:816Z
转换后的时间中缺少 SSS 部分“901”。需要帮助保留 SSS 部分,因为我需要按准确时间对记录进行排序。
谢谢!
from_unixtime
总是在 分钟 (yyyy-MM-dd HH:mm:ss)
之前得到 millisecs
我们需要做一些变通办法。
- 我们将使用
regexp_extract
从 old_time 中提取millisecs
然后concat
到from_unixtime
结果并最终转换为timestamp
.
Example:
select old_time,
timestamp(concat_ws(".", --concat_ws with . and cast
FROM_UNIXTIME(UNIX_TIMESTAMP(old_time, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"),"yyyy-MM-dd HH:mm:ss"), -- from_unixtime and unix_timestamp to convert without millisecs
regexp_extract(string(old_time),".+\.(.*)(?i)z",1))) as newtime from --regexp_extract to extract last 3 digits before z then concat
(select string("2020-03-11T21:14:41.335Z")old_time)e
+------------------------+-----------------------+
|old_time |newtime |
+------------------------+-----------------------+
|2020-03-11T21:14:41.335Z|2020-03-11 21:14:41.335|
+------------------------+-----------------------+
UPDATE:
您的示例数据在毫秒之前有 :
,请尝试以下查询:
select old_time,
timestamp(concat_ws(".", --concat_ws with . and cast
FROM_UNIXTIME(UNIX_TIMESTAMP(old_time, "yyyy-MM-dd'T'HH:mm:ss:SSS'Z'"),"yyyy-MM-dd HH:mm:ss"), -- from_unixtime and unix_timestamp to convert without millisecs
regexp_extract(string(old_time),".+\:(.*)(?i)z",1))) as newtime from --regexp_extract to extract last 3 digits before z then concat
(select string("2020-03-11T21:14:41:335Z")old_time)e
只需将 'T'
替换为 space ' '
删除 'Z'
并将最后的 ':'
替换为点,如下所示:
select regexp_replace('2020-03-09T16:05:06:827Z','(.*?)T(.*?):([^:]*?)Z$',' \.');
结果:
2020-03-09 16:05:06.827
如果您需要转换为不同的格式并保留毫秒,另请阅读此答案: