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 回答