【发布时间】:2012-02-21 06:16:41
【问题描述】:
我写了一个存储过程,要执行这个过程,我需要传递一个数据类型为'DATE'的IN参数。
现在我将简要介绍一下我的 IN 参数。
假设我想查看 'December 2011' 的出勤率,那么我需要将 'IN' 参数传递为“Previous_month_of_last_date”,即“2011-11-30”。然后我的程序执行并给我整个 12 月的出勤详细信息。
希望你还在我身边。
现在我的问题来了。
我在 GUI 下提供了用户。
因此用户将在这里选择“年”和“月”,假设他想查看“2011 年 12 月”报告,那么他将选择“2011”作为年份,“12 月”作为月份作为输入。
现在我想编写一个 JavaScript 代码,它将这些“年”和“月”作为输入,并将今年和月转换为“Previous_month's_last_date”格式,例如“2011-11-30”为“2011” 12 月报告”。
那么我应该如何编写一个脚本来将正确的输入传递给我的程序。
任何建议都会有所帮助。
这是我的存储过程。
DELIMITER $$
USE `Sample`$$
DROP PROCEDURE IF EXISTS `Test`$$
CREATE DEFINER=`Sample`@`%` PROCEDURE `Test`(IN month_last_date DATE)
BEGIN
SELECT
users.id AS Id,
users.first_name AS Employee,cl_territories.name AS Territory,
CASE MAX(CASE WHEN DATE_FORMAT(main.cdate,'%d')='01' THEN main.task
WHEN DATE_FORMAT(DATE_ADD(month_last_date, INTERVAL 1 DAY),'%W')='SUNDAY' THEN 0
WHEN main.cdate IS NULL THEN -1
ELSE -2 END)
WHEN -1 THEN 'NA'
WHEN 0 THEN 'S'
WHEN 1 THEN 'Y'
WHEN 2 THEN 'C'
WHEN 3 THEN 'S1'
WHEN 4 THEN 'P'
WHEN 5 THEN 'M'
WHEN 6 THEN 'H'
WHEN 7 THEN 'L'
END Day1,
CASE MAX(CASE WHEN DATE_FORMAT(main.cdate,'%d')='02' THEN main.task
WHEN DATE_FORMAT(DATE_ADD(month_last_date, INTERVAL 2 DAY),'%W') ='SUNDAY' THEN 0
WHEN main.cdate IS NULL THEN -1
ELSE -2 END)
WHEN -1 THEN 'NA'
WHEN 0 THEN 'S'
WHEN 1 THEN 'Y'
WHEN 2 THEN 'C'
WHEN 3 THEN 'S1'
WHEN 4 THEN 'P'
WHEN 5 THEN 'M'
WHEN 6 THEN 'H'
WHEN 7 THEN 'L'
END Day2,
.
.
. # upt o 31 days
CASE MAX(CASE WHEN DATE_FORMAT(main.cdate,'%d')='31' THEN main.task
WHEN DATE_FORMAT(DATE_ADD(month_last_date, INTERVAL 31 DAY),'%W')='SUNDAY' THEN 0
WHEN main.cdate IS NULL THEN -1
ELSE -2 END)
WHEN -1 THEN 'NA'
WHEN 0 THEN 'S'
WHEN 1 THEN 'Y'
WHEN 2 THEN 'C'
WHEN 3 THEN 'S1'
WHEN 4 THEN 'P'
WHEN 5 THEN 'M'
WHEN 6 THEN 'H'
WHEN 7 THEN 'L'
END Day31
FROM
users LEFT JOIN users_cstm
ON users.id=users_cstm.id_c
LEFT JOIN cl_territories
ON users_cstm.cl_territories_id1_c=cl_territories.id
LEFT JOIN
(
SELECT DATE_FORMAT(cl_doctor_call.date_entered,'%Y-%m-%d')AS cdate,
cl_doctor_call.created_by AS emp,
1 task
FROM
cl_doctor_call
WHERE
DATE_FORMAT(cl_doctor_call.date_entered,'%Y-%m-%d')>month_last_date AND
DATE_FORMAT(cl_doctor_call.date_entered,'%Y-%m-%d')<=DATE_ADD(month_last_date, INTERVAL 30 DAY)
UNION ALL
SELECT
DATE_FORMAT(cl_chemist_call.date_entered,'%Y-%m-%d') AS cdate,
cl_chemist_call.created_by AS emp,
2 task
FROM
cl_chemist_call
WHERE
DATE_FORMAT(cl_chemist_call.date_entered,'%Y-%m-%d')>month_last_date AND
DATE_FORMAT(cl_chemist_call.date_entered,'%Y-%m-%d')<=DATE_ADD(month_last_date, INTERVAL 30 DAY)
UNION ALL
SELECT
DATE_FORMAT(cl_stockist_call_cstm.calldate_c,'%Y-%m-%d') AS cdate,
cl_stockist_call.created_by AS emp,
3 task
FROM
cl_stockist_call LEFT JOIN cl_stockist_call_cstm
ON cl_stockist_call.id=cl_stockist_call_cstm.id_c
WHERE
DATE_FORMAT(cl_stockist_call_cstm.calldate_c,'%Y-%m-%d')> month_last_date AND
DATE_FORMAT(cl_stockist_call_cstm.calldate_c,'%Y-%m-%d')<=DATE_ADD(month_last_date, INTERVAL 30 DAY)
UNION ALL
SELECT DATE_FORMAT(cl_product_pramotional_call.date_entered,'%Y-%m-%d') AS cdate,
cl_product_pramotional_call.created_by AS emp,
4 task
FROM cl_product_pramotional_call
WHERE
DATE_FORMAT(cl_product_pramotional_call.date_entered,'%Y-%m-%d')>month_last_date AND
DATE_FORMAT(cl_product_pramotional_call.date_entered,'%Y-%m-%d')<=DATE_ADD(month_last_date, INTERVAL 30 DAY)
UNION ALL
SELECT DATE_FORMAT(meetings.date_start,'%Y-%m-%d') AS cdate,
meetings.created_by AS emp,
5 task
FROM meetings
WHERE
DATE_FORMAT(meetings.date_start,'%Y-%m-%d')> month_last_date AND
DATE_FORMAT(meetings.date_start,'%Y-%m-%d') <= DATE_ADD(month_last_date, INTERVAL 30 DAY)
UNION ALL
SELECT DATE_FORMAT(cl_holidays_structures.holiday_date,'%Y-%m-%d') AS cdate,
users.id AS emp,
6 task
FROM users LEFT JOIN users_cstm
ON users.id=users_cstm.id_c
LEFT JOIN cl_states
ON users_cstm.cl_states_id1_c=cl_states.id
LEFT JOIN cl_holidays_structures
ON cl_holidays_structures.cl_states_id_c=users_cstm.cl_states_id1_c
WHERE
DATE_FORMAT(cl_holidays_structures.holiday_date,'%Y-%m-%d')> month_last_date AND
DATE_FORMAT(cl_holidays_structures.holiday_date,'%Y-%m-%d') <= DATE_ADD(month_last_date, INTERVAL 30 DAY)
UNION ALL
SELECT cl_leave_management_cstm.from_date_c+ INTERVAL td.days DAY cdate,
users.id AS emp,
7 task
FROM
cl_leave_management LEFT JOIN cl_leave_management_cstm
ON cl_leave_management.id=cl_leave_management_cstm.id_c
LEFT JOIN users
ON cl_leave_management.created_by = users.id
JOIN temp_days td
ON DATEDIFF(cl_leave_management_cstm.to_date_c, cl_leave_management_cstm.from_date_c) >= td.days
WHERE DATE_FORMAT(cl_leave_management_cstm.from_date_c,'%Y-%m-%d')> month_last_date AND
DATE_FORMAT(cl_leave_management_cstm.from_date_c,'%Y-%m-%d')<=DATE_ADD(month_last_date, INTERVAL 30 DAY) AND
cl_leave_management_cstm.status_c='Approved'
)AS main
ON main.emp = users.id
WHERE DATE_FORMAT(users.date_entered,'%Y-%m-%d')<= month_last_date
GROUP BY users.id ;
END$$
DELIMITER ;
这是我的 SP 的示例输出
Employee Year Month 1 2 3 4 5 6 7....
John 2011 December Y Y Y H Y L S....
Jenny 2011 December Y Y Y Y Y M S....
.
.
.
all employees with all, these columns
【问题讨论】:
-
这个可以在SP中完成。你能提供你的sql脚本吗?
-
我的第一个想法是:他是如何得到问题中的那些
input对象的? :-) -
是的,检查一下,我已经添加了我的 sp 。
-
如果我的问题还需要更多解释,请告诉我。
标签: javascript mysql date stored-procedures