2012-10-11 99 views
4

只需选择月份日和月份的第一天之间的所有日期。我想用填写所有日期的临时表选择月份的第一天到当前日期之间的所有日期

declare @temp table 
(
    ddate datetime 
) 

我试图与with cte,我不想监守我想避免,而在存储过程,而循环使用。

例如今天是11-oct-2012

所以临时表中应该有11行从开始到1-oct-201211-oct-2012

+0

为什么你不想使用while循环? – tobias86

回答

18

试试这个

DECLARE @startDate DATE=CAST(MONTH(GETDATE()) AS VARCHAR) + '/' + '01/' + + CAST(YEAR(GETDATE()) AS VARCHAR) -- mm/dd/yyyy 
DECLARE @endDate DATE=GETDATE() -- mm/dd/yyyy 

SELECT [Date] = DATEADD(Day,Number,@startDate) 
FROM master..spt_values 
WHERE Type='P' 
AND DATEADD(day,Number,@startDate) <= @endDate 

OR

DECLARE @startDate DATETIME=CAST(MONTH(GETDATE()) AS VARCHAR) + '/' + '01/' + + CAST(YEAR(GETDATE()) AS VARCHAR) -- mm/dd/yyyy 
DECLARE @endDate DATETIME= GETDATE() -- mm/dd/yyyy 

;WITH Calender AS 
(
    SELECT @startDate AS CalanderDate 
    UNION ALL 
    SELECT CalanderDate + 1 FROM Calender 
    WHERE CalanderDate + 1 <= @endDate 
) 
SELECT [Date] = CONVERT(VARCHAR(10),CalanderDate,25) 
FROM Calender 
OPTION (MAXRECURSION 0) 

enter image description here

+1

+1,不知道为什么这是被拒绝:) – Andomar

3
declare @temp table (ddate datetime); 

insert @temp 
select DATEDIFF(d,0,GetDate()-Number) 
from master..spt_values 
where type='p' and number < DatePart(d,Getdate()) 
order by 1; 
+0

你的答案是非常好的,简而言之,我使用这个,但@Biswas答案是之前,所以我接受了一个答案,因为这也给了我正确的记录。 – rahularyansharma

+0

您还有一件事从1900年算起?我是吗?所以有可能这些日子会溢出,而且它不会给我们正确的答案?我只是怀疑.. – rahularyansharma

+0

不,我从1900年没有计算过。'Datediff(d,0'只用于从'GetDate() - Number'去掉当前月份只产生日期的时间。 – RichardTheKiwi

相关问题