如何在sql server 2005中获取x和y之间的日期表

anhgbhbe  于 2023-02-15  发布在  SQL Server
关注(0)|答案(9)|浏览(113)

我只想用一种快速的方法(最好不要使用while循环)来创建一个包含date @x和date @y之间的每个日期的表,这样我就可以保留对一些统计表的外部连接,其中一些统计表对于其间的某些日期没有记录,这样我就可以用0来标记缺失的日期

xa9qqrwz

xa9qqrwz1#

严格地说,这并没有完全回答你的问题,但它相当整洁。
假设您可以指定起始日期之后的天数,则使用公用表表达式可以:

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 )
w9apscun

w9apscun2#

我会创建一个Calendar表,其中只包含从合适的开始日期到合适的结束日期的每个日期,这样不会占用数据库中太多的空间,并且会使这些类型的查询变得非常简单。

select  ...
from    Calendar
        left outer join
        ...
where   Calendar.Date >= @x
and     Calendar.Date <= @y
ojsjcaue

ojsjcaue3#

我想你最好用while循环来做,我知道这很难,但是很简单,而且很有效。

f45qwnt8

f45qwnt84#

不久前我也在做类似的事情,但是我想不出一个不使用循环的方法。
我得到的最好的是一个临时表,然后选择我想加入其中的日期。
bduke链接到的博客很可爱,尽管我认为临时表解决方案可能是一个更干净的解决方案。

xe55xuns

xe55xuns5#

我发现另一个表存储每个日期(它是网站的访问者),那么这个怎么样...

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%的可能性是每天都有数据。

ryhaxcpt

ryhaxcpt6#

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 )
atmip9wb

atmip9wb7#

你必须编辑下面的LEFT JOIN语句,这样它才能给你的统计表贴上标签,以适合你的用例。同时,这里有一些受BigJump答案启发的东西,是用TSQL写的。

  • 目的:返回数据集idl_sourceTable中的所有间隔日,其中间隔日是在idl_sourceTable中没有对应记录的一天。
  • 制约因素:无回路

要求:
1.必须创建包含连续日期的表。

  1. startDate和endDate必须可指定为输入。
    1.结果应该允许从记录具有DATETIME字段的其他表中检测缺失的日期。
  • -根据idl_sourceTable的[timeGenerated]声明参数
DECLARE @startDate DATE SET @startDate = ( SELECT CAST (MIN ([timeGenerated]) AS DATE) FROM idl_sourceTable )
    DECLARE @endDate DATE SET @endDate = ( SELECT CAST (MAX ([timeGenerated]) AS DATE) FROM idl_sourceTable )
    DECLARE @dateRange INT SET @dateRange = ( SELECT DATEDIFF (DAY, @startDate, @endDate) )

    SELECT @startDate, @endDate, @dateRange;
    
-- Create #tempDateTable containing dates delimited between the MIN and MAX timeGenerated of idl_sourceTable

    DROP TABLE IF EXISTS #tempDateTable;
            
    WITH numbers_CTE ( n ) AS (
            SELECT 1 UNION ALL
            SELECT 1 + n FROM numbers_CTE WHERE n <= @dateRange )
        SELECT DATEADD (DAY, n-1, @startDate) AS [date] INTO #tempDateTable FROM numbers_CTE
        OPTION ( MAXRECURSION 0 ) -- disables the default 100 recursion level for the CTE

    SELECT * FROM #tempDateTable

-- Display dates which are not represented in idl_sourceTable

    SELECT basis.[date] AS [missingDays] FROM #tempDateTable basis
    LEFT JOIN ( SELECT DISTINCT CAST ( [timeGenerated] AS DATE ) AS [objectDate] FROM idl_sourceTable ) AS object ON object.[objectDate] = basis.[date]
    WHERE object.[objectDate] IS NULL
bq9c1y66

bq9c1y668#

只需要编写循环。必须有人为此编写循环,无论是您还是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
dgtucam1

dgtucam19#

只是:WHERE列〉开始日期AND列〈结束日期

相关问题