mysql - 简化查询以创建 TIMESTAMP 列

标签 mysql sql database concat querying

我有一个表格,其中包含 'year''month''day''hour''minute' 分开。

除了 'month' (VARCHAR) 之外的所有列都是 INTEGER,我添加了一个新列来将所有内容放在一起,'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'
    );

它起作用了,但是…… 我的问题是是否有更简单的方法来编写查询来完成同样的事情。

最佳答案

DATE() 函数中以“YYYYMMDD”格式输入数字或字符串会生成 DATE。

MAKETIME() 函数接受小时、分钟和秒来返回 TIME。

然后,当您连接一个 DATE 和一个 TIME 并且中间有一个空格时,可以将生成的字符串放入 DATETIME 或 TIMESTAMP 中。

UPDATE dates
SET date_time = CONCAT(DATE(year*10000 + month*100 + day),' ',MAKETIME(hour,minute,0));

db<>fiddle 测试 here

关于mysql - 简化查询以创建 TIMESTAMP 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54393500/

相关文章:

php - JQuery AJAX PHP post方法问题

Group_concat 的 php、sql 单独链接

mysql - 数据建模,我应该使用多少 fk?

java - 从 jtextfield java GUI 将值插入到 mysql 表中

sql - 数据库模式

php - 无法使用 PHP 从 MySQL 获取

php - 编写 MySQLI 调用的更好方法

mysql - WAR部署在本地工作但在远程不工作

c# - Windows Phone 8 中使用的数据库

sql - 奇怪的 SQL 行为,我想知道为什么会这样