sql server2008 如何獲取上月、上周、昨天、今天、本周、本月的查詢周期(通過存儲過程)


我這邊有一個需求要統計訂單數據,需要統計訂單的上傳日期,統計的模塊大概是

那么上月、上周、昨天、今天、本周、本月應該是怎樣呢?

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM