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年2月28日 三月| 2013-03-01 | 2013年3月25日
答案 0 :(得分: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
答案 1 :(得分: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;
答案 2 :(得分:0)
如何将所有结果插入新表?