mysql获取区间开始时间和结束时间的函数
函数代码
CREATE DEFINER=`root`@`localhost` FUNCTION `f_tool_date_begin_end`(
/**
次函数用于计算一个日期的各种类型的开始和结束时间,精确到秒
**/
`in_date` datetime,# 输入日期
# 类型:
/*
D:天;用于返回日期所在天的开始或结束时间
M:月份;用于返回日期所在月份的开始或结束时间
W:周;用于返回日期所在周的开始或结束时间,默认周一是第一天
Q:季度;用于返回日期所在季度的开始或结束时间
Y:年份;用于返回日期所在年份的开始或结束时间
*/
`in_type` varchar(5),
# 开关:返回开始时间还是结束时间
/*
BEGIN:返回开始时间
END:返回结束时间
*/
`in_begin_or_end` varchar(10)
) RETURNS datetime
BEGIN
declare v_rt datetime;
# ----------------------------------------------------计算开始时间
if in_begin_or_end = 'BEGIN' then
if in_type = 'D' then # 本日开始时间
set v_rt = date_format(in_date,'%Y-%m-%d 00:00:00');
elseif in_type = 'W' then # 本周开始时间
set v_rt = date_format(date_sub(in_date,interval weekday(in_date) day),'%Y-%m-%d 00:00:00');
elseif in_type = 'M' then # 本月开始时间
set v_rt = date_format(in_date,'%Y-%m-01 00:00:00');
elseif in_type = 'Q' then # 本季开始时间
set v_rt = date_add(date_format(in_date,'%Y-01-01 00:00:00'),interval (3 * (quarter(in_date) - 1)) month);
elseif in_type = 'Y' then # 本年开始时间
set v_rt = date_format(in_date,'%Y-01-01 00:00:00');
end if;
# ----------------------------------------------------计算结束时间
elseif in_begin_or_end = 'END' then
if in_type = 'D' then # 本日结束时间
set v_rt = date_add(date_add(date_format(in_date,'%Y-%m-%d 00:00:00'), interval 1 day),interval -1 second);
elseif in_type = 'W' then # 本周结束时间
set v_rt = date_format(date_add(date_sub(in_date,interval weekday(in_date) day),interval 6 day),'%Y-%m-%d 23:59:59');
elseif in_type = 'M' then # 本月结束时间
set v_rt = date_sub(date_format(date_add(in_date,interval 1 month),'%Y-%m-01 00:00:00'),interval 1 second);
elseif in_type = 'Q' then # 本季结束时间
set v_rt = date_sub(date_add(date_format(in_date,'%Y-01-01 00:00:00'),interval (3 * quarter(in_date)) month),interval 1 second);
elseif in_type = 'Y' then # 本年结束时间
set v_rt = date_sub(date_add(date_format(in_date,'%Y-01-01 00:00:00'),interval 1 year),interval 1 second);
end if;
end if;
RETURN v_rt;
END
代码调用:
select
SYSDATE(),
f_tool_date_begin_end(SYSDATE(),'D','BEGIN') 本日开始,
f_tool_date_begin_end(SYSDATE(),'D','END') 本日结束,
f_tool_date_begin_end(str_to_date('2020-05-11 13:14:15','%Y-%m-%d %H:%i:%s'),'W','BEGIN') 本周开始1,
f_tool_date_begin_end(str_to_date('2020-05-15 13:14:15','%Y-%m-%d %H:%i:%s'),'W','END') 本周结束1,
f_tool_date_begin_end(SYSDATE(),'W','BEGIN') 本周开始2,
f_tool_date_begin_end(SYSDATE(),'W','END') 本周结束2,
f_tool_date_begin_end(SYSDATE(),'M','BEGIN') 本月开始,
f_tool_date_begin_end(SYSDATE(),'M','END') 本月结束,
f_tool_date_begin_end(SYSDATE(),'Q','BEGIN') 本季开始,
f_tool_date_begin_end(SYSDATE(),'Q','END') 本季结束,
f_tool_date_begin_end(SYSDATE(),'Y','BEGIN') 本年开始,
f_tool_date_begin_end(SYSDATE(),'Y','END') 本年结束
FROM DUAL