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

posted @ 2017-06-27 18:25  小小邪  阅读(9240)  评论(0编辑  收藏  举报