0

ストアドプロシージャは、ユーザが任意の日付を使用して呼び出せるように設定されています。私は2ヶ月に渡された日付を制限できるようにしたい。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

日付は任意の 'VARCHAR'フィールドではなく、' DATE'型でなければならないことに注意してください。 – tadman

答えて

0

、N量ot VARCHAR)。

また、このチェックする必要があります:不平等は日付が(pc.check_date - INTERVAL DAY 10)の後方た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 

はお知らせ。これは、スキーマに応じて、多くの場合とそうでない場合があります。 GROUP BYおよびORDER BYを使用せずにクエリをテストし、正確に何が返されるかを調べる必要があります。重複がたくさんある場合は、より良いJOIN条件を使用すると、より迅速にクエリを作成できます。今

は、あなたの主な質問については、答えは簡単です:それは非常に簡単です

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

あなたのPROCにこれを追加します。ここでどのようにraise an error mysqlストアドプロシージャ(あなたのバージョンに応じて行う方法)です。

「ここであなたのメッセージを選択してください」とするだけで、メッセージ文字列がクライアントに返されることもあります(特定の列のセットを期待していたのでクラッシュする可能性があります。エラー)。

+0

ありがとう!素晴らしい仕事! – nick

+0

1つの問題。もし私がこのようにすれば、私は報告書をどのように呼んでいるのですか(コールソフトのrpt_missing_payroll_files_report($ {Begin_Date}、$ {End_Date}、$ {Country}、$ {is_submitted} $ {file_success})}このようにすれば、表示される唯一のフィールドはエラーメッセージです – nick

+0

あなたの報告ソフトウェアにエラーを通知する方法を見つけなければなりません(私はこれを使ったことはないので、ここでは助けてください) 。 – peufeu

関連する問題