如何获取在x和y之间的日期表在sql服务器2005
我只想要一个快速的方法(最好不使用while循环)创建日期@x和日期@y之间的每个日期的表,所以我可以将外部联接留给某些统计表,其中一些统计表在其间的某些统计表中没有记录,从而允许我用缺少的记录标记0如何获取在x和y之间的日期表在sql服务器2005
严格来说,这并不完全回答你的问题,但它的整洁。
假设你可以指定天数的开始日期后,再使用公共表表达式生活给你:
WITH numbers (n) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM numbers WHERE n < 500)
SELECT DATEADD(day,n-1,'2008/11/01') FROM numbers
OPTION (MAXRECURSION 500)
Just:WHERE col> start-date AND col < end date date
他试图创建一个表来做左外连接。这不会做他想做的事。 – 2008-09-18 18:25:08
我相信你正在寻找this blog post。
它很脏,但它做的工作 – digiguru 2008-09-18 18:26:47
它可以移植到其他SQL引擎(包括Server 2000)。 :) – IDisposable 2009-10-19 19:54:24
我认为你不妨在while循环中做。我知道这很丑陋,但很简单,它很有效。
我实际上正在做一些类似的事情,但我不能想出一种不使用循环的方式。
我得到的最好的是一张临时表,然后选择我想要加入的日期。
博客bduke链接到可爱,虽然我认为临时表解决方案可能是一个更干净的解决方案。
我发现,(它的网站访问者),那么这个怎么样保存每次约会另一个表...
Declare @FromDate datetime,
@ToDate datetime
Declare @tmpDates table
(StatsDate datetime)
Set @FromDate = DateAdd(day,-30,GetDate())
Set @ToDate = GetDate()
Insert Into @tmpDates (StatsDate)
Select
distinct CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME)
FROM tbl_visitorstats
Where visitDate between @FromDate And @ToDate
Order By CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME)
Select * FROM @tmpDates
它不依赖于具有每次约会我的条目其他表想要,但98%可能会有每天的数据。
只要写循环。有人必须为此编写一个循环,无论是你还是SQL Server。
DECLARE @Dates TABLE
(
TheDate datetime PRIMARY KEY
)
DECLARE @StartDate datetime, @EndDate datetime
SELECT @StartDate = '2000-01-01', @EndDate = '2010-01-01'
DECLARE @LoopVar int, @LoopEnd int
SELECT @LoopEnd = DateDiff(dd, @StartDate, @EndDate), @LoopVar = 0
WHILE @LoopVar <= @LoopEnd
BEGIN
INSERT INTO @Dates (TheDate)
SELECT DateAdd(dd,@LoopVar,@StartDate)
SET @LoopVar = @LoopVar + 1
END
SELECT *
FROM @Dates
我会创建一个日历表,它只包含从合适的开始日期到合适的结束日期的每个日期。这不会占用您数据库中的太多空间,并且会使这些类型的查询变成游戏。
select ...
from Calendar
left outer join
...
where Calendar.Date >= @x
and Calendar.Date <= @y
作为https://stackoverflow.com/a/95728/395440给出的答案略有扭曲。允许指定日期并计算到当前日期的范围。
DECLARE @startDate datetime
SET @startDate = '2015/5/29';
WITH number (n) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM dates WHERE n < DATEDIFF(Day, @startDate, GETDATE()))
SELECT DATEADD(day,n-1,@startDate) FROM number where
datename(dw, DATEADD(day,n-1,@startDate)) in ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')
OPTION (MAXRECURSION 500)
你是一个天才!干得好,没有想到使用CTE! – digiguru 2008-09-18 19:26:09