我這邊有一個需求要統計訂單數據,需要統計訂單的上傳日期,統計的模塊大概是
那么上月、上周、昨天、今天、本周、本月應該是怎樣呢?
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