首页 文章

如何获取sql server中两个日期之间的当前月份名称,开始日期和结束日期

提问于
浏览
3
create procedure dummy2
as
begin
declare @sDate datetime,
        @eDate datetime

select  @sDate = '2013-02-25',
        @eDate = '2013-03-25'

;with cte as (


  select  convert(datetime,left(convert(varchar,@sdate,112),6) + '01') startDate ,
       month(@sdate) n
  union all
  select dateadd(month,n,convert(datetime,convert(varchar,year(@sdate)) + '0101')) startDate,
        (n+1) n 

  from cte
  where n < month(@sdate) + datediff(month,@sdate,@edate)  
)

select CONVERT(varchar(20), DATENAME(MONTH, startdate))as Months, startdate, dateadd(day,-1,dateadd(month,1,startdate)) enddate
from cte
end

Months  startdate   enddate
February    2013-02-01 00:00:00.000     2013-02-28 00:00:00.000
March   2013-03-01 00:00:00.000 2013-03-31 00:00:00.000

嗨我需要获取开始日期和结束日期列表,月份名称是两个日期,上面是我的查询,但结果不正确..我需要如下结果

注意:开始日期和结束日期是我给出的,在那几天之间我的月份开始日期和结束日期列表,月份名称

月| startdate |结束日期


2月| 2013-02-25 | 2013-02-28三月| 2013-03-01 | 2013年3月25日

3 回答

  • 2

    这可能会对你有所帮助

    declare @sDate datetime,
            @eDate datetime
    select  @sDate = '2013-02-21',
            @eDate = '2013-04-25'
    ;WITH CTE_TEST AS (
        SELECT @sDate SDATE,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@sDate)+1,0)) EDATE
        UNION ALL
        SELECT  EDATE+1,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,DATEADD(MONTH,1,SDATE))+1,0))
        FROM    CTE_TEST C WHERE DATEADD(MONTH,1,SDATE) < DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@eDate)+1,0))
    )   
    SELECT DATENAME(MONTH,SDATE) MNAME,SDATE,(CASE WHEN EDATE > @eDate THEN @eDate ELSE EDATE END) EDATE FROM CTE_TEST
    
  • 0

    在数据仓库中,我们使用一个称为日期维度的表,这有助于性能,计算错误以及在该数据库中使用日期的任何人的单点事实 . 您当然可以添加有关所需日期的任何数据,但为了简洁起见,我只添加了完整日期和MonthName:

    CREATE TABLE DimDate
    (
        DateKey INT NOT NULL PRIMARY KEY CLUSTERED,
        DateFull DATETIME NOT NULL,
        DateMonthName VARCHAR(20) NOT NULL
    );
    

    这是一些示例数据:

    DateKey DateFull DateMonthName


    20130201 2013-02-01 00:00:00.000二月

    20130202 2013-02-02 00:00:00.000二月

    那么你的查询变得如此简单:

    SELECT
        Months = ddd.DateMonthName,
        startDate = MIN(ddd.DateFull),
        endDate = MAX(ddd.DateFull)
    FROM
        dbo.DimDate ddd WITH(NOLOCK)
    WHERE
        ddd.DateFull BETWEEN '2013-02-25' AND '2013-03-25'
    GROUP BY
        ddd.DateMonthName;
    

    下面是你更新的dummy2 proc:

    CREATE PROCEDURE dummy2
    AS
    BEGIN
        DECLARE
            @sDate  DATETIME,
            @eDate  DATETIME;
    
        SELECT
            @sDate = '2013-02-25',
            @eDate = '2013-03-25';
    
        SELECT
            Months = ddd.DateMonthName,
            startDate = MIN(ddd.DateFull),
            endDate = MAX(ddd.DateFull)
        FROM
            dbo.DimDate ddd WITH(NOLOCK)
        WHERE
            ddd.DateFull BETWEEN @sDate AND @eDate
        GROUP BY
            ddd.DateMonthName;
    END;
    
  • 0

    如何将所有结果插入新表?

相关问题