我这边有一个需求要统计订单数据,需要统计订单的上传日期,统计的模块大概是
那么上月、上周、昨天、今天、本周、本月应该是怎样呢?
1、数据分析
因为今天是动态数据,我要查月份(上月、本月),应该是一个日期范围(开始日期到结束日期)
要查周期(上周、本周),是星期一到星期天,要转化为日期范围
这样,将上月、上周、昨天、今天、本周、本月这些作为一个参数,我们来查询对应的日期范围。创建一个有输入参数和输出参数的存储过程,通过输入参数(周期类型)获取输出参数(日期范围
2、创建存储过程
--存储过程语法-- create proc sp_GetDateCycle ( @DateRage varchar(20), --输入参数 @startDate varchar(30) , --输出参数 @endDate varchar(30) -- 输出参数 ) as begin if(@DateRage = ‘上月’) begin --返回日期的算法 end if(@DateRage = ‘上周’) begin --返回日期的算法 end --继续判断--- ----- end go
3、实例如下
/*********************************************** 根据日期周期类型返回查询周期 输入参数:@DateRage:日期周期类型 输出参数:@startDate:查询周期的开始日期 @endDate:查询周期的结束日期 ***********************************************/ /*** ** 获取查询的周期 ***/ create proc [dbo].[sp_GetDateCycle]( @DateRage varchar(20), @startDate varchar(30) output, @endDate varchar(30) output ) as begin --声明变量-- declare @nowDate datetime declare @startstr varchar(20) declare @endstr varchar(20) declare @datestr1 varchar(30) declare @datestr2 varchar(30) --初始化变量-- set @startstr = ' 00:00:00' set @endstr = ' 23:59:59' --进行日期范围判断-- if(@DateRage='上月') begin ----计算当前日期与sql的初始日期(1900-01-01 00:00:00)的差值,返回月份 --select DATEDIFF(MM,0,GETDATE()) ----返回月份减去1,计算出上个月第一天日期-- --select DATEADD(MM,DATEDIFF(MM,0,GETDATE())-1,0) ----获取当前月第一天日期-- --select DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0) ----减去3毫秒,计算出上个月的最后一天日期(sql精确到3毫秒)-- --select DATEADD(MS,-3,DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0)) --返回上月查询日期(开始到结束) 日期类型转字符类型-- set @startDate = CONVERT(varchar(19),DATEADD(MM,DATEDIFF(MM,0,GETDATE())-1,0),120) set @endDate = CONVERT(varchar(19),DATEADD(MS,-3,DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0)),120) end if(@DateRage ='上周') begin -- --计算当前日期与sql的初始日期差值(返回周)-- --select DATEDIFF(wk,0,GETDATE()) ----返回的周期数减去1,,得到上周星期一的日期-- --SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE())-1,0) ----获取本周星期一的日期-- --SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()),0) ----减去3毫秒,计算上周星期天的日期-- --select DATEADD(MS,-3, DATEADD(wk, DATEDIFF(wk,0,GETDATE()),0)) --返回上周查询日期(开始到结束) 日期类型转字符类型 -- set @startDate = CONVERT(varchar(19),DATEADD(wk, DATEDIFF(wk,0,GETDATE())-1,0),120) set @endDate = CONVERT(varchar(19),DATEADD(MS,-3, DATEADD(wk, DATEDIFF(wk,0,GETDATE()),0)),120) end if(@DateRage='昨天') begin /*** 思考步骤如下: 1)获取昨天日期(日期类型 yyyy-MM-dd hh:mm:ss) 2)转化昨天日期(字符类型 yyyy-MM-dd) 3)返回查询日期(开始日期到结束日期) ***/ ----获取昨天日期-- -- select DATEADD(DAY,-1,GETDATE()) --将日期类型转换为字符类型(yyyy-MM-dd) select @datestr1 = CONVERT(varchar(10),DATEADD(DAY,-1,GETDATE()),120) select @datestr2 = CONVERT(varchar(10),DATEADD(DAY,-1,GETDATE()),120) --返回昨天查询日期(开始到结束)-- set @startDate = @datestr1 + @startstr set @endDate = @datestr2 + @endstr end if(@DateRage='今天') begin /*** 思考步骤如下: 1)获取当前日期(日期类型 yyyy-MM-dd hh:mm:ss) 2)转化当前日期(字符类型 yyyy-MM-dd) 3)返回查询日期(开始日期到结束日期) ***/ ---- 获取当前日期-- --select DATEADD(DAY,0,GETDATE()) --将日期类型转换为字符类型(yyyy-MM-dd) select @datestr1 = CONVERT(varchar(10),DATEADD(DAY,0,GETDATE()),120) select @datestr2 = CONVERT(varchar(10),DATEADD(DAY,0,GETDATE()),120) --返回今天查询日期(开始到结束)-- set @startDate = @datestr1 + @startstr set @endDate = @datestr2 + @endstr end if(@DateRage='本周') begin -- --计算当前日期与sql的初始日期差值(返回周)-- --select DATEDIFF(wk,0,GETDATE()) ----获取本周的星期一的日期-- --SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()),0) ----返回的周期数加上1,计算下周的星期一的日期-- --SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE())+1,0) ----减去3毫秒,计算本周星期天的日期-- --select DATEADD(MS,-3,DATEADD(wk,DATEDIFF(wk,0,GETDATE())+1,0)) --返回本周查询日期(开始到结束)-- set @startDate = CONVERT(varchar(19), DATEADD(wk, DATEDIFF(wk,0,GETDATE()),0),120) set @endDate = CONVERT(varchar(19),DATEADD(MS,-3,DATEADD(wk,DATEDIFF(wk,0,GETDATE())+1,0)),120) end if(@DateRage='本月') begin -- --计算当前日期与sql的初始日期(1900-01-01 00:00:00)的差值,返回月份 --select DATEDIFF(MM,0,GETDATE()) ----得到当前月第一天日期-- --select DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0) ----返回月份加上1,计算出下个月第一天日期-- --select DATEADD(MM,DATEDIFF(MM,0,GETDATE())+1,0) ----减去3毫秒,计算出当前月的最后一天日期-- --select DATEADD(MS,-3,DATEADD(MM,DATEDIFF(MM,0,GETDATE())+1,0)) --返回本月的查询日期(开始到结束---- --将当前月第一天日期转化(日期类型转字符类型) set @startDate = CONVERT(varchar(19),DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0),120) --将当前月最后一天日期转化(日期类型转字符类型) set @endDate = CONVERT(varchar(19),DATEADD(MS,-3,DATEADD(MM,DATEDIFF(MM,0,GETDATE())+1,0)),120) end end
点击执行,生成存储过程: sp_GetDateCycle
4、调用存储过程
创建成功后,怎样调用辨析的存储过程呢?
--声明输出参数-- declare @startDate varchar(30) declare @endDate varchar(30) --获取上个月的查询日期-- --exec sp_GetDateCycle '上月',@startDate output,@endDate output --获取上周的查询日期-- --exec sp_GetDateCycle '上周',@startDate output,@endDate output --获取昨天的查询日期-- --exec sp_GetDateCycle '昨天',@startDate output,@endDate output --获取今天的查询日期-- --exec sp_GetDateCycle '今天',@startDate output,@endDate output --获取本周的查询日期-- exec sp_GetDateCycle '本周',@startDate output,@endDate output --获取本月的查询日期-- --exec sp_GetDateCycle '本月',@startDate output,@endDate output --输出查询周期--- select @startDate select @endDate
5、实际效果如下:
1)当调用存储过程输入参数为今天,返回的日期范围
2)当调用存储过程输入参数为上周,返回的日期范围
3)当调用存储过程输入参数为上月,返回日期范围
PS:
参考网址: http://blog.csdn.net/zengcong2013/article/details/50134373