Sql server 日期介于2个日期变量之间

Sql server 日期介于2个日期变量之间,sql-server,tsql,variables,datediff,Sql Server,Tsql,Variables,Datediff,我有一张桌子,上面有客户ID、姓名、房间号、开始日期和结束日期。我想在开始日期和结束日期之间创建一个日期每日明细列表,但希望它看起来像我在excel中在下面的链接中模拟的tbale: 我用过 =IFTEXTD2,DD/MM/YYYY=TEXTE2,DD/MM/YYYY,相同,IFF2=DATEYEARD2,MONTHD2,DAYD2,开始,IFF2=DATEYEARE2,MONTHE2,DAYE2,结束,在逻辑列中的公式之间 我曾尝试将以下几点SQL整合到我的查询中,但似乎无法让它实现我想要的功

我有一张桌子,上面有客户ID、姓名、房间号、开始日期和结束日期。我想在开始日期和结束日期之间创建一个日期每日明细列表,但希望它看起来像我在excel中在下面的链接中模拟的tbale:

我用过

=IFTEXTD2,DD/MM/YYYY=TEXTE2,DD/MM/YYYY,相同,IFF2=DATEYEARD2,MONTHD2,DAYD2,开始,IFF2=DATEYEARE2,MONTHE2,DAYE2,结束,在逻辑列中的公式之间

我曾尝试将以下几点SQL整合到我的查询中,但似乎无法让它实现我想要的功能:

declare @fromdate dateTIME
set @fromdate= '1/1/2017'(Wanted to used Column Startdate)
declare @todate dateTIME = getdate()-1(Wanted used Column Enddate)
;with CTE AS
(SELECT @fromdate AS RESULT
UNION ALL
SELECT RESULT + 1 FROM CTE WHERE RESULT<=@todate
)
SELECT Result,1 as Count FROM CTE OPTION(MAXRECURSION 0)

任何帮助都将不胜感激。

您的查询中有哪些地方不起作用还不完全清楚。如果需要每天获取行数,最简单的方法是在数据库中实际准备一个日期表。您可以在视图中参考此日期表。下面是我在多个项目中使用的一个示例

CREATE PROCEDURE [dbo].[FillDateTable](@StartDate DATE, @EndDate DATE) AS
BEGIN 
TRUNCATE TABLE dbo.DateTable;

WITH CTERecursive AS (
    SELECT @StartDate AS 'CalendarDate' 
    UNION ALL 
    SELECT DATEADD(DAY,1,CalendarDate) AS 'CalendarDate' 
    FROM CTERecursive 
    WHERE DATEADD(DAY,1,CalendarDate)<=@EndDate
), TotalCalendar AS (
SELECT CalendarDate
    , DAY(CalendarDate) AS 'Day'
    , MONTH(CalendarDate) AS 'Month'
    , YEAR(CalendarDate) AS 'Year' 
    , DATEADD(DAY,-DATEPART(WEEKDAY,CalendarDate)+1,CalendarDate) AS 'FirstDayOfWeek' 
    , DATEADD(DAY,6,DATEADD(DAY,-DATEPART(WEEKDAY,CalendarDate)+1,CalendarDate)) AS 'LastDayOfWeek' 
FROM CTERecursive
)
INSERT INTO dbo.DateTable ([CalendarDate], [Day], [Month], [Year], [FirstDayOfWeek], [LastDayOfWeek], [NewWeek])
SELECT  *
    ,   NewWeek=CASE WHEN CalendarDate=FirstDayOfWeek THEN 1 ELSE 0 END 
FROM    TotalCalendar 
OPTION (MAXRECURSION 0)
END
此外,在CTE中使用DATEADD而不是+1是明智的

DECLARE @fromdate DATE
SET     @fromdate=CONVERT(DATE,'20170101',112)
DECLARE @todate DATE=GETDATE()-1
;
WITH CTE AS
    (SELECT @fromdate AS RESULT
    UNION ALL
    SELECT DATEADD(DAY,1,RESULT) FROM CTE WHERE RESULT<=@todate
    )
SELECT [DateInclusive]=RESULT
,1 as Count FROM CTE OPTION(MAXRECURSION 0)
更新:我假设你们有一张带有Id、房间、姓名、开始日期和结束日期的桌子。您的查询可以按如下方式进行结构,生成与Excel模型类似的概览:

DECLARE @Bookings TABLE ([Id] VARCHAR(30), [Room] INT, [Name] VARCHAR(255), [Startdate] DATE, [Enddate] DATE)
INSERT INTO @Bookings VALUES ('V123789',8,'H. Brown','20170201','20170315'),('V555589',1,'J. Frost','20170205','20170420');

WITH CTE AS
    (SELECT Id, [Startdate] AS InclusiveDate FROM @Bookings
    UNION ALL
    SELECT Id, DATEADD(DAY,1,InclusiveDate) FROM CTE WHERE InclusiveDate < (SELECT Enddate FROM @Bookings WHERE Id=CTE.Id)
    )
SELECT B.[Id], B.[Room], B.[Name], B.[Startdate], B.[Enddate], CTE.[InclusiveDate]
, CASE WHEN CTE.[InclusiveDate]=B.[Startdate] THEN 'Start' 
       WHEN CTE.[InclusiveDate]=B.[Enddate] THEN 'End' 
       WHEN CTE.[InclusiveDate]>B.[Startdate] AND CTE.[InclusiveDate]<B.[Enddate] THEN 'Between' END AS Logic 
FROM CTE 
JOIN @Bookings B on B.Id=CTE.[Id]
ORDER BY B.[Id], CTE.[InclusiveDate] ASC
OPTION(MAXRECURSION 0)

在询问有关数据的问题时,图像对任何人都没有帮助。以可消费的格式发布数据。这对你们来说是一个好的开始:问题对我来说并不清楚,我想要的结果是选择[ID]、[Name]、[Room]、[StartDate]、[EndDate]&然后将fromdate设置为[StartDate]&将todate设置为[EndDate]然后使用上面的SQL生成包含日期的列,并使用与我在excel中使用的公式类似的公式生成一个类似于我在图片中的模拟表的表,这很有用,但我希望的结果是选择[ID]、[Name]、[Room]、[StartDate]、[EndDate]&然后将fromdate设置为[StartDate]、将todate设置为[EndDate]使用上面的SQL生成包含日期的列,并使用与我在excel中使用的公式类似的公式生成一个类似于图中模拟表的表格。请参阅我修改后的答案。