SQL to SELECT JOIN 两个日期之间的年月日

SQL to SELECT JOIN to year, month, day between two dates

我正在使用查询结果中列出的两个日期之间的 YEAR、MONTH 和 DAY 连接两个表。 Table A 可能有一些 Table B 没有的日期,但我需要显示 null/0 结果,无论是否有要加入的日期。

我正在寻找有关创建单独查询(或函数)的指导,该查询采用开始日期和结束日期,将它们分解为年、月、日,这样我就可以将其用作我的基础来加入另一个两张桌子。

我的要求有点像这个功能我发现 returns 指定日期的所有时间。我需要两个日期之间的所有年、月、日。

declare @date datetime = '1/1/2018'
select  dateadd(hour, number, cast(floor(cast(@date as float)) as datetime)) as StartHour, 
        dateadd(hour, number+1, cast(floor(cast(@date as float)) as datetime)) as EndHour 
from master.dbo.spt_values 
where number < 24 and type = 'p

StartHour               EndHour
2018-01-01 00:00:00.000 2018-01-01 01:00:00.000
2018-01-01 01:00:00.000 2018-01-01 02:00:00.000
2018-01-01 02:00:00.000 2018-01-01 03:00:00.000
...
2018-01-01 22:00:00.000 2018-01-01 23:00:00.000
2018-01-01 23:00:00.000 2018-01-02 00:00:00.000

提前致谢! 旦

这是我去统计或数字的地方 table。它非常适合这种事情。我在我的系统上保留了一个计数 table 作为这样的视图。

create View [dbo].[cteTally] as

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )
select N from cteTally

GO

现在您可以立即查询多达 10,000 个序号。但是我们如何利用它来解决像您这样的问题?

declare @StartDate datetime = '20180501'
    , @EndDate datetime = '20180520'

select dateadd(day, t.N - 1, @StartDate)
from cteTally t
where t.N <= datediff(day, @StartDate, @EndDate) + 1
order by t.N

--编辑-- 如果您需要数小时或数天,目前还不清楚。但是,如果您想要小时,只需将 DATEDIFF 函数更改为小时而不是天。

您可以像这样为您的约会动态创建 'tally' table:

DECLARE @start DATETIME='20000101';
DECLARE @end DATETIME='20180517';

WITH
    [days] AS (
                  SELECT TOP(DATEDIFF(d, @start, @end)+1)ROW_NUMBER() OVER (ORDER BY t1.object_id) AS N
                  FROM master.sys.all_columns t1
                       CROSS JOIN master.sys.all_columns t2
              ),
    tally(myDate) AS (SELECT DATEADD(d, [days].N-1, @start)FROM [days])
SELECT * FROM tally;