1

MySQL で、計算されたデルタ値によってデータベース内のすべての日付/日時列をシフトする方法はありますか?

静的テーブルと列 (テーブルと列は常に同じ) から最大日付を取得し、それを 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'
;

そしてそれを実行するには、1つの方法は上記をgenerate.sqlに入れてから実行することです:

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

もちろん、サーバー、データベース、ユーザーなどの適切なパラメーターを使用して.

于 2013-10-31T04:33:34.063 に答える