使用sed设置日期的动态毫秒数

thigvfpy  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(350)

我从数据库中检索日期并使用sed对其进行格式化,以便与另一个数据库中的其他日期进行比较。
这两个数据库不同(mssql和hive)。
mssql中的日期格式如下:

sed "s/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)\ \([0-9]\{2\}\):\([0-9]\{2\}\):\([0-9]\{2\}\)\.\([0-9]\{3\}\)/\1-\2-\3 \4:\5:\6/g")

然而,我不知道如何做它的日期从Hive。
目标输出为:yyyy-mm-dd hh:mm:ss
Hive的输入是 YYYY-MM-dd HH:mm:ss.S 或者 YYYY-MM-dd HH:mm:ss.SS 或者 YYYY-MM-dd HH:mm:ss.SSS .
这是由于配置单元在插入过程中忽略了毫秒内的0位数字。
例如: YYYY-MM-dd HH:mm:ss.XX0 将成为 YYYY-MM-dd HH:mm:ss.XX 在Hive里 YYYY-MM-dd HH:mm:ss.X00 将成为 YYYY-MM-dd HH:mm:ss.X 在Hive里 YYYY-MM-dd HH:mm:ss.000 将成为 YYYY-MM-dd HH:mm:ss.0 在Hive里
是否有一个sed命令可以处理所有这些情况,或者应该使用其他解决方案?

xnifntxz

xnifntxz1#

你可以替换 \.\([0-9]\{3\}\)\.\([0-9]\{1,3\}\) :

sed "s/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)\ \([0-9]\{2\}\):\([0-9]\{2\}\):\([0-9]\{2\}\)\.\([0-9]\{1,3\}\)/\1-\2-\3 \4:\5:\6/g"

在线查看 sed 演示。
关键是您的原始regex在末尾匹配了三个数字(因此,需要三毫秒才能出现在末尾)。与 \{1,3\} ,则需要有一个、两个或三个数字。

相关问题