1

start_dateend_dateおよび間隔のあるテーブルがあります。end_dateの値start_dateと間隔で更新したいと思います。

create table date_test (
    start_date      date,
    end_date        date,
    date_interval   varchar(45)
);

私が使用している値は、のdate_intervalようなものです。- INTERVAL 1 WEEK+ INTERVAL 1 MONTH

私は次のようなことをしたいと思います:

UPDATE date_test SET end_date = date( concat( start_date, " ", date_interval));

しかし、私はこの警告を受け取ります:

1292 切り捨てられた誤った日付値: '2012-01-01 - INTERVAL 1 week'

更新する前にこの日付を強制的に評価するにはどうすればよいですか?

4

3 に答える 3

1

ジョナサン・レフラーは次のように述べています。

ほぼ; ただし、マニュアルページと質問には決定的な違いがあります。マニュアルでは DATE_ADD(date_value, INTERVAL '1' DAY) などについて説明していますが、問題は 2 番目のパラメーターとして「文字列」値を持つことです。質問には、文字列を区間型に変換する関数が必要になるのではないかと心配しています。MySQL には「TO_INTERVAL」関数がないようです。

これは、日付を最初のパラメーターとして、文字列の間隔を 2 番目のパラメーターとして受け取る関数です。

次のストアド プロシージャをデータベースに追加するだけです。

CREATE PROCEDURE my_date_add(d DATE, i VARCHAR(50))
BEGIN
  DECLARE sign CHAR(1);
  DECLARE x INT;

  SET sign = SUBSTRING_INDEX(i, ' ', 1);
  SET x = SUBSTRING_INDEX(SUBSTRING_INDEX(i, ' ', -2), ' ', 1);

  IF sign = '-' THEN
    SET x = -x;
  END IF;

  CASE SUBSTRING_INDEX(i, ' ', -1)
    WHEN 'DAY' THEN SELECT DATE_ADD(d, INTERVAL x DAY);
    WHEN 'WEEK' THEN SELECT DATE_ADD(d, INTERVAL x WEEK);
    WHEN 'MONTH' THEN SELECT DATE_ADD(d, INTERVAL x MONTH);
  END CASE;
END

次に、次のようにテーブルを更新できるはずです。

UPDATE date_test SET end_date = my_date_add(start_date, date_interval);
于 2012-07-04T00:33:36.720 に答える
0

MySQL は値の評価をサポートしていません。したがって、UPDATE ステートメントを直接使用することはできません。

この場合、次の方法をお勧めします。

  • UPDATEステートメントのリストを生成し、このすべてのステートメントをファイルに出力するSELECT ... INTO OUTFILEステートメントを作成してから、このスクリプトを実行します。

  • または、テーブルでカーソルを開くストアド プロシージャを記述date_testし、ループ内で、準備済みステートメントを使用して、各レコードの UPDATE ステートメントを 1 つずつ生成および実行します。

解決策について質問がある場合は、尋ねてください。

于 2012-07-03T05:38:06.337 に答える
0

あなたがしたいことは:

UPDATE date_test SET end_date = DATE_ADD(start_date, date_interval);

しかし、2 番目のパラメーターとして date_interval を使用してもうまくいくかどうかはわかりません。うまくいくかどうか教えてください。

MySQL のドキュメントには便利な例がたくさんあります。DATE_ADD()関数の説明を参照してください。

于 2012-07-03T01:07:13.480 に答える