我正在使用查询结果中突破的两个日期之间的YEAR,MONTH和DAY连接两个表。表A可能有一些表B没有的日期,但无论是否有加入日期,我都需要显示null / 0结果。
我正在寻找有关创建一个单独的查询(或函数)的指导,该查询(或函数)包含开始和结束日期,将它们分解为YEAR,MONTH,DAY,因此我可以将其作为我的基础来加入其他两个表
我的请求有点像我发现的这个函数返回指定日期的所有小时。我需要两个日期之间的所有年,月,日。
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
提前致谢! 丹
答案 0 :(得分:0)
这是我去数字或数字表的地方。它非常适合这种事情。我在我的系统上保留了一个计数表作为这样的视图。
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
- EDIT-- 你是想要几小时或几天都不是很清楚。但是如果你想要几个小时,只需将DATEDIFF功能更改为小时而不是白天。
答案 1 :(得分:0)
你可以创建一个&#39; tally&#39;这样的表格为您的日期:
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;