0

次の20年間の日付だけを含むテーブルがあります。このテーブルをクイックルックアップとして使用して、アプリケーションに関連する日付に関する特定の情報を判別します。たとえば、日付が休日である場合、日付に特定のインジケーターのフラグが付けられている場合などです。

私がやろうとしているのは、指定された日付から始めて、テーブルからn番目の有効な日を取得することです。基本的に、制限されたサブクエリの戻り値で値を更新するだけです。これが私のコードですので、制限でエラーが発生します。

UPDATE _piece_detail
INNER JOIN mail_classes 
   ON mail_classes.class_id = _piece_detail.class_id
SET _piece_detail.est_delivery_date = 
(SELECT date_value FROM date_lookup 
WHERE date_value >= _piece_detail.date_prepared AND holiday != 1 
LIMIT mail_classes.max_days,1)
WHERE est_delivery_date IS NULL;

mail_classes.max_days整数にキャストしようとしましたが、それでもうまくいきません。カウントする必要のある日数はメールクラスに基づいているため、これを可変にする必要があります。

4

3 に答える 3

0

代わりにこれを試してください:

(SELECT min(date_value) FROM date_lookup 
 WHERE date_value >= _piece_detail.date_prepared AND holiday != 1)

これにより、指定された日付の後の最初の非休日が返されます。

パフォーマンスが心配な場合は、テーブル「nextNonHoliday」に新しい列を追加し、これらの値を事前に計算します。

于 2012-05-07T20:52:06.953 に答える
0

LIMITは可変パラメーターを持つことができず、定数でなければなりません。したがって、テーブルフィールド値またはユーザー定義変数のいずれにもなりません。次の解決策をお勧めします。

SET @rownum:=0;
UPDATE _piece_detail
INNER JOIN mail_classes 
ON mail_classes.class_id = _piece_detail.class_id
SET _piece_detail.est_delivery_date = 
(
  SELECT date_value FROM 
  (
    SELECT date_value,(@rownum:=@rownum+1) AS rownum FROM date_lookup 
    WHERE date_value >= _piece_detail.date_prepared AND holiday != 1 
  ) 
  AS t_tmp
  WHERE t_tmp.rownum = mail_classes.max_days
)
WHERE est_delivery_date IS NULL;
于 2012-05-08T08:31:17.020 に答える
0

関数を作成し、それをルーチンで使用することでこれを解決しました。機能は次のとおりです。

CREATE DEFINER=`sample`@`%` FUNCTION `get_valid_date`(start_date DATE, added_days INT) RETURNS date
    DETERMINISTIC
BEGIN
     DECLARE new_date DATE;

    SELECT date_value 
    FROM date_tbl
    WHERE date_tbl.date_value >= start_date
        AND date_tbl.day_of_week != 1
    LIMIT added_days,1
    INTO new_date;

     RETURN new_date;

END
于 2012-05-30T02:14:25.127 に答える