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;
我正在使用查询结果中列出的两个日期之间的 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;