0

存储过程已设置,因此用户可以使用任何日期对其进行调用。我希望能够限制通过两个月的日期。如何限制在mysql存储过程中传递日期的数据

当用户在没有选择任何日期的情况下调用报表时,报表服务器崩溃是因为数据太多。我希望能够限制行如果通过日期超过2个月。

DELIMITER ;; 
    DROP PROCEDURE IF EXISTS rpt_missing_payroll_files_report_test;; 
    CREATE PROCEDURE `rpt_missing_payroll_files_report_test`(
     IN BEGIN_DATE VARCHAR(255), 
     IN END_DATE VARCHAR(255) 
    ) 
    BEGIN 

    SELECT c.id, 
      c.name, 
      ip.name AS icp_name, 
      s.name AS country_name, 
      sc.name AS pm_name, 
      pc.frequency, 
      pc.check_date AS check_date, 
      pc.transmit_date, 
      IFNULL(ps.updated_at, ph.updated_at) AS submit_date, 
      cpp.created_at AS date_received, 
      ifnull(cpp.import_filename,'N/A') AS import_filename, 
      CASE WHEN cpp.created_at IS NOT NULL THEN 1 END AS date_received_sum, 
      CASE WHEN cpp.success = 1 THEN 1 END AS file_successsum, 
      DATEDIFF(pc.check_date,cpp.created_at) AS date_diff, 
      DATE_FORMAT(BEGIN_DATE,'%m/%d/%Y') AS BeginDate, 
      DATE_FORMAT(END_DATE,'%m/%d/%Y') AS EndDate 
    FROM co_payroll_calendars pc 
    inner join co_infos c on pc.co_info_id = c.id                                
    inner join icp_countries icp on c.icp_country_id = icp.id 
    INNER JOIN sys_countries s ON icp.sys_country_id = s.id 
    INNER JOIN icp_infos ip ON ip.id = icp.icp_info_id 
    LEFT OUTER JOIN co_payroll_entry_setups ps ON pc.id = ps.co_payroll_calendar_id             
    LEFT OUTER JOIN co_payroll_entry_setup_histories ph ON pc.id = ph.co_payroll_calendar_id         
    LEFT OUTER JOIN co_payroll_processes cpp ON cpp.check_date >= (pc.check_date - INTERVAL 10 DAY) AND cpp.co_info_id = c.id 
    LEFT OUTER JOIN sys_csrs sc ON c.sys_csr_id = sc.id 
    -- below is the part i probably need to change 
    WHERE (ifnull(BEGIN_DATE,'') = '' 
      OR pc.check_date >= BEGIN_DATE) 
     AND (ifnull(END_DATE,'') = '' 
      OR pc.check_date <= END_DATE) 
    GROUP BY id, 
      check_date 
    ORDER BY country_name, check_date DESC, c.id; 

    END;; 
    DELIMITER ; 

以下应被允许

CALL rpt_missing_payroll_files_report_test( '2017年6月1日', '2017年7月1日')

以下不应该被允许或限制在一定行的量

CALL rpt_missing_payroll_files_report_test(“2016年1月1日”,“2017年7月1日”)

+0

请注意日期应该是'DATE'类型,而不是任意'VARCHAR'字段。 – tadman

回答

0

设置参数为正确的类型(即,使用日期,正ot VARCHAR)。

您也应该检查这一点:

LEFT OUTER JOIN co_payroll_processes cpp 
ON cpp.check_date >= (pc.check_date - INTERVAL 10 DAY) 
AND cpp.co_info_id = c.id 

通知不平等将选择相匹配的有日期晚于ID的所有行(pc.check_date - 间隔10天)。这可能很多,或者不是,取决于您的模式。您应该在没有GROUP BY和ORDER BY的情况下测试查询,然后仔细检查它返回的结果。如果您发现大量重复项,则可以使用更好的JOIN条件使查询速度更快。现在

,你的主要问题,答案很简单:添加到您的PROC

IF END_DATE > (BEGIN_DATE + INTERVAL 2 MONTH) THEN 
    raise an error 
ELSE 
    your huge SELECT 
END IF 

这是相当简单的。这里是如何在一个mysql存储过程中执行raise an error(这取决于你的版本)。 “你也可以简单地在这里”选择“你的消息,然后消息字符串将被返回给客户端(这可能会崩溃,因为它期望有一组列,所以最好提高错误)。

+0

谢谢!非常棒! – nick

+0

有一个问题。如果我这样做,我不能在pentaho(报告软件)中调用proc,这里是我如何调用报告{call rpt_missing_payroll_files_report($ {Begin_Date},$ {End_Date},$ {Country},$ {is_submitted}, $ {file_success})}如果我这样做,唯一显示的字段是错误消息 – nick

+0

是的,你必须找到一种方法来将错误传达给你的报告软件(我从来没有使用过这个,所以不能帮助这里) 。 – peufeu

相关问题