Sql server 日期介于2个日期变量之间
我有一张桌子,上面有客户ID、姓名、房间号、开始日期和结束日期。我想在开始日期和结束日期之间创建一个日期每日明细列表,但希望它看起来像我在excel中在下面的链接中模拟的tbale: 我用过 =IFTEXTD2,DD/MM/YYYY=TEXTE2,DD/MM/YYYY,相同,IFF2=DATEYEARD2,MONTHD2,DAYD2,开始,IFF2=DATEYEARE2,MONTHE2,DAYE2,结束,在逻辑列中的公式之间 我曾尝试将以下几点SQL整合到我的查询中,但似乎无法让它实现我想要的功能: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整合到我的查询中,但似乎无法让它实现我想要的功
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中使用的公式类似的公式生成一个类似于图中模拟表的表格。请参阅我修改后的答案。