I have a table with columns of 'year'
, 'month'
, 'day'
, 'hour'
and 'minute'
separately.
All columns INTEGER except 'month' (VARCHAR)
and I added a new column to put everything together, '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> |
+------+-------+------+------+--------+-----------+
I made a query to fill the 'date_time'
column like this:
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'
);
It worked but... My question is if there's a simpler way to write a query to do the same thing.