1

MySQL 中有没有办法通过计算的 delta 值移动数据库中的所有日期/日期时间列?

我想从静态表和列(表和列始终相同)中获取最大日期,然后从 curdate() 值中减去该最大日期,以获得所说的最大值是落后的天数。然后我想数据库中的所有日期/日期时间值移动该数字,有效地将数据库中的所有记录带到当前时间。

我知道我可以使用该information_schema.columns属性来拉取日期/日期时间的所有列,但我不确定如何将它构建到一个有效的“和理智”查询中来进行更新。

我在想类似的东西:

SELECT concat('UPDATE ', table_name, ' set ', column_name, ' = date_add(', column_name, ', INTERVAL datediff(curdate(), max(given_table.given_column)) day);')
from information_schema.columns
where data_type in ('date', 'datetime') and table_schema = 'mydatabase';`

但是很明显,这有很多问题,所以我知道我不能使用它。

有没有办法计算 X 数据库列和现在之间的增量,然后按该值移动数据库中的所有日期/日期时间列?

4

1 回答 1

2

我认为这里没有任何灵丹妙药,也许只是稍微清理一下您的查询。我尝试了以下方法,它似乎适用于我的数据库:

 select @diff_in_days := datediff(curdate(), max(given_column))
   from given_table
;

 select concat(
            'update ', table_name,
              ' set ', column_name, ' = date_add(',
                            column_name,
                            ', interval ', @diff_in_days, ' day',
                       ');'
        )
   from information_schema.columns
  where data_type in ('date', 'datetime') and table_schema = 'mydatabase'
;

要执行它,一种方法是将上述内容放入 generate.sql 中,然后执行以下操作:

mysql < generate.sql > update.sql
mysql < update.sql

当然,为您的服务器、数据库、用户等提供适当的参数。

于 2013-10-31T04:33:34.063 回答