【问题标题】:how to get current month name, start date and end date between two dates in sql server如何在sql server中的两个日期之间获取当前月份名称、开始日期和结束日期
【发布时间】:2016-03-24 08:18:36
【问题描述】:
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

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

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

月 |开始日期 |结束日期


二月 | 2013-02-25 | 2013-02-28 三月 | 2013-03-01 | 2013-03-25

【问题讨论】:

  • 如果你不需要时间开始使用日期作为数据类型

标签: sql-server date datetime


【解决方案1】:

这可能对你有帮助

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  

【讨论】:

  • 这对我很有用..建议提高我的 sql server 技能的教程
  • Edited.Query 已简化,请立即查看
  • @yoges script DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@sDate)+1,0)) 用于获取结束日期当前月份/@sDate。希望你能对这个查询有用,因为你已经使用 CTE 做了类似的事情
【解决方案2】:

在数据仓库中,我们使用称为日期维度的表,这有助于提高性能、计算错误,并为使用该数据库中日期的任何人提供单点真实性。您当然可以添加任何有关您需要的日期的数据,但为了简洁起见,我只添加了完整日期和月份名称:

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;

【讨论】:

    【解决方案3】:

    将所有结果插入新表怎么样?

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 2020-12-17
      • 1970-01-01
      • 2018-01-09
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      相关资源
      最近更新 更多