Отформатируйте дату с помощью Dynami c количество цифр в миллисекундах с помощью sed - PullRequest
1 голос
/ 25 марта 2020

Я извлекаю даты из базы данных и форматирую их, используя sed, для сравнения с другими датами из другой базы данных.

Две базы данных не совпадают (MS SQL и Hive).

Дата из MS SQL правильно отформатирована следующим образом:

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.

Целевой вывод: ГГГГ-ММ-дд ЧЧ: мм: сс

Ввод из Hive YYYY-MM-dd HH:mm:ss.S ИЛИ YYYY-MM-dd HH:mm:ss.SS ИЛИ YYYY-MM-dd HH:mm:ss.SSS.

Это вызвано игнорированием Hive где-то во время вставки 0 цифр в миллисекундах.

Например:

YYYY-MM-dd HH:mm:ss.XX0 станет YYYY-MM-dd HH:mm:ss.XX в Улей

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, которая может обработать все эти случаи, или следует использовать другое решение?

1 Ответ

1 голос
/ 25 марта 2020

Вы можете заменить \.\([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"

См. online sed demo .

Суть в том, что ваше оригинальное регулярное выражение соответствует трем цифрам в конце (таким образом, в конце потребовалось три миллисекунды). С \{1,3\} вам требуется одна, две или три цифры, чтобы присутствовать там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...