У меня есть таблица со столбцами 'year'
, 'month'
, 'day'
, 'hour'
и 'minute'
отдельно.
Все столбцы INTEGER, кроме 'month' (VARCHAR)
, и я добавил новый столбецчтобы сложить все вместе, 'date_time' (TIMESTAMP)
.
+------+-------+------+------+--------+-----------+
| year | month | day | hour | minute | date_time |
+------+-------+------+------+--------+-----------+
| 1987 | 12 | 15 | 9 | 25 | <NULL> |
| 1997 | 10 | 10 | 10 | 40 | <NULL> |
| 1994 | 08 | 9 | 6 | 30 | <NULL> |
+------+-------+------+------+--------+-----------+
Я сделал запрос, чтобы заполнить столбец 'date_time'
следующим образом:
UPDATE dates
SET date_time =
COALESCE(
STR_TO_DATE(
CASE WHEN
CONCAT(
year,
'-',
CASE WHEN LPAD(month, 2, 0) BETWEEN 1 AND 12 THEN LPAD(month, 2, 0) ELSE NULL END,
'-',
CASE WHEN LPAD(day, 2, 0) BETWEEN 1 AND 31 THEN LPAD(day, 2, 0) ELSE NULL END,
' ',
CASE WHEN LPAD(hour, 2, 0) BETWEEN 0 AND 23 THEN LPAD(hour, 2, 0) ELSE NULL END,
':',
CASE WHEN LPAD(minute, 2, 0) BETWEEN 0 AND 59 THEN LPAD(minute, 2, 0) ELSE NULL END,
':00'
)
LIKE '%NULL%' THEN NULL
ELSE
CONCAT(
year,
'-',
CASE WHEN LPAD(month, 2, 0) BETWEEN 1 AND 12 THEN LPAD(month, 2, 0) ELSE NULL END,
'-',
CASE WHEN LPAD(day, 2, 0) BETWEEN 1 AND 31 THEN LPAD(day, 2, 0) ELSE NULL END,
' ',
CASE WHEN LPAD(hour, 2, 0) BETWEEN 0 AND 23 THEN LPAD(hour, 2, 0) ELSE NULL END,
':',
CASE WHEN LPAD(minute, 2, 0) BETWEEN 0 AND 59 THEN LPAD(minute, 2, 0) ELSE NULL END,
':00'
)
END,
'%Y-%m-%d %H:%i:%s'
),
'0000-00-00 00:00:00'
);
Это сработало, но ... Мой вопросесли есть более простой способ написать запрос, чтобы сделать то же самое.