其实写存储过程就相当于在下写有逻辑的SQL。
存储过程中的时类有:
ADDTIME (date2 ,time_interval ) //将time_interval加到date2
CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //转换时区
CURRENT_DATE ( ) //当前日期
CURRENT_TIME ( ) //当前时间
CURRENT_TIMESTAMP ( ) //当前时间戳
DATE (datetime ) //返回datetime的日期部分
DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或时间
DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime
DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间
DATEDIFF (date1 ,date2 ) //两个日期差
DAY (date ) //返回日期的天
DAYNAME (date ) //英文星期
DAYOFWEEK (date ) //星期(1-7) ,1为星期天
DAYOFYEAR (date ) //一年中的第几天
EXTRACT (interval_name FROM date ) //从date中提取日期的指定部分
MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串
MAKETIME (hour ,minute ,second ) //生成时间串
MONTHNAME (date ) //英文月份名
NOW ( ) //当前时间
SEC_TO_TIME (seconds ) //秒数转成时间
STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示
TIMEDIFF (datetime1 ,datetime2 ) //两个时间差
TIME_TO_SEC (time ) //时间转秒数]
WEEK (date_time [,start_of_week ]) //第几周
YEAR (datetime ) //年份
DAYOFMONTH(datetime) //月的第几天
HOUR(datetime) //小时
LAST_DAY(date) //date的月的最后日期
MICROSECOND(datetime) //微秒
MONTH(datetime) //月
MINUTE(datetime) //分
在存储过程中要对字段进行格式化可以使用DATE_FORMAT(字段,格式)函数。
例如:
DELIMITER $$
USE `trshdev_dw_audit`$$
DROP PROCEDURE IF EXISTS `SP_Staff_Info_Frank`$$
CREATE DEFINER=`trshdev_dw_audit`@`%` PROCEDURE `SP_Staff_Info_Frank`()
BEGIN
DECLARE V_DATE_TO DATETIME;
DECLARE V_SP_NAME VARCHAR(30) DEFAULT 'SP_Plan_Info_Frank';
DECLARE V_TAB_LEVEL VARCHAR(20);
DECLARE V_LOG_STEP_NO VARCHAR(20);
DECLARE V_LOG_BEGIN_TIME DATETIME DEFAULT SYSDATE();
DECLARE V_LOG_DESC VARCHAR(768);
DECLARE V_LOG_ROWCOUNT INT;
DECLARE V_SP_BEGIN_DATE DATETIME DEFAULT SYSDATE();
DECLARE V_STEP_DESC VARCHAR(20);
DECLARE V_ERR INT;
DECLARE P_OUT_SQLCODE INT DEFAULT 0;
DECLARE P_OUT_ERRMSG VARCHAR(800) DEFAULT 'SUCCESS';
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND SET v_err = 1;
SET V_LOG_STEP_NO = 'SETP_01';
CALL SP_INSERT_LOG(
V_DATE_TO,
V_SP_NAME,
V_TAB_LEVEL,
V_LOG_STEP_NO,
V_LOG_BEGIN_TIME,
V_LOG_DESC,
V_LOG_ROWCOUNT,
V_SP_BEGIN_DATE,
V_STEP_DESC,
P_OUT_SQLCODE,
P_OUT_ERRMSG
);
TRUNCATE TABLE TRSHDEV_DW_AUDIT.`staff_info`;
CALL SP_UPDATE_LOG(
V_DATE_TO,
V_SP_NAME,
V_TAB_LEVEL,
V_LOG_STEP_NO,
V_LOG_BEGIN_TIME,
V_LOG_DESC,
V_LOG_ROWCOUNT,
V_SP_BEGIN_DATE,
V_STEP_DESC,
P_OUT_SQLCODE,
P_OUT_ERRMSG
);
SET V_LOG_STEP_NO = 'SETP_01';
CALL SP_INSERT_LOG(
V_DATE_TO,
V_SP_NAME,
V_TAB_LEVEL,
V_LOG_STEP_NO,
V_LOG_BEGIN_TIME,
V_LOG_DESC,
V_LOG_ROWCOUNT,
V_SP_BEGIN_DATE,
V_STEP_DESC,
P_OUT_SQLCODE,
P_OUT_ERRMSG
);
INSERT TRSHDEV_DW_AUDIT.`staff_info` (
`Staff_No`,
`Staff_Name`,
`Sex`,
`Id_type`,
`Idno`,
`quano`,
`JoinDate`,
`LeaveDate`,
`Edu_Degree`,
`Accreditation`,
`Depart_info`,
`Is_Leader`,
`Staff_Rank`
)
SELECT
A.EMPLOYEE_CODE,
A.NAME,
A.GENDER,
A.CERTI_TYPE,
A.CERTI_CODE,
NULL,
DATE_FORMAT(A.ONBOARD_DATE,'%Y%m%d') AS ONBOARD_DATE,
DATE_FORMAT(A.TERMINATION_DATE, '%Y%m%d') AS TERMINATION_DATE,
A.EDUCATION,
A.TITLE,
A.ORGAN_ID,
NULL,
A.TITLE
FROM TRSH_DEV.T_EMPLOYEE A;
COMMIT;
CALL SP_UPDATE_LOG(
V_DATE_TO,
V_SP_NAME,
V_TAB_LEVEL,
V_LOG_STEP_NO,
V_LOG_BEGIN_TIME,
V_LOG_DESC,
V_LOG_ROWCOUNT,
V_SP_BEGIN_DATE,
V_STEP_DESC,
P_OUT_SQLCODE,
P_OUT_ERRMSG
);
IF v_err = 1 THEN
SET v_err = 2;
END IF;
END$$
DELIMITER ;