Sql server 使用两个日期之间的日期(如日历日期)对不同列进行动态更新
我的问题是:Sql server 使用两个日期之间的日期(如日历日期)对不同列进行动态更新,sql-server,Sql Server,我的问题是: 例如:checkindate=04/06/2017,checoutdate=9/06/2017在比较两个日期时,我对第1列到第6列的更新值为0。这是一个基于集合的解决方案,它避免了所有这些,而不是创建一个临时表并使用光标更新每组列 对于第一部分,如果您只需要7天,那么您可以使用一个简单的值理货表和: 否则,您可以使用堆叠的CTE以如下方式生成临时日期表: declare @fromdate date = '20170605'; ;with dates as ( select
例如:checkindate=04/06/2017,checoutdate=9/06/2017在比较两个日期时,我对第1列到第6列的更新值为0。这是一个基于集合的解决方案,它避免了所有这些,而不是创建一个临时表并使用光标更新每组列 对于第一部分,如果您只需要7天,那么您可以使用一个简单的值理货表和: 否则,您可以使用堆叠的CTE以如下方式生成临时日期表:
declare @fromdate date = '20170605';
;with dates as (
select
[Date]=convert(date,dateadd(day,rn-1,@fromdate))
, rn
from (values (1),(2),(3),(4),(5),(6),(7)) t(rn)
)
然后与roommaster交叉连接日期,并左键连接登记表和预订表,查看房间是否已预订或当前已入住:
declare @fromdate date = '20170605';
declare @thrudate date = dateadd(day,6,@fromdate)
;with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n))
, dates as (
select top (datediff(day, @fromdate, @thrudate)+1)
[Date]=convert(date,dateadd(day,row_number() over(order by (select 1))-1,@fromdate))
, rn = row_number() over(order by (select 1))
from n as deka cross join n as hecto cross join n as kilo
cross join n as tenK cross join n as hundredK
order by [Date]
)
带条件聚合的rextester演示:
带pivot的rextester演示:
两者都会为我的演示数据返回相同的结果:
select
roomid
, Day1 = [1]
, Day2 = [2]
, Day3 = [3]
, Day4 = [4]
, Day5 = [5]
, Day6 = [6]
, Day7 = [7]
from cte
pivot (min(value) for rn in ([1],[2],[3],[4],[5],[6],[7]))p
编号和日历表参考:
这是一个基于集合的解决方案,它避免了创建临时表和使用光标更新每组列 对于第一部分,如果您只需要7天,那么您可以使用一个简单的值理货表和: 否则,您可以使用堆叠的CTE以如下方式生成临时日期表:
declare @fromdate date = '20170605';
;with dates as (
select
[Date]=convert(date,dateadd(day,rn-1,@fromdate))
, rn
from (values (1),(2),(3),(4),(5),(6),(7)) t(rn)
)
然后与roommaster交叉连接日期,并左键连接登记表和预订表,查看房间是否已预订或当前已入住:
declare @fromdate date = '20170605';
declare @thrudate date = dateadd(day,6,@fromdate)
;with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n))
, dates as (
select top (datediff(day, @fromdate, @thrudate)+1)
[Date]=convert(date,dateadd(day,row_number() over(order by (select 1))-1,@fromdate))
, rn = row_number() over(order by (select 1))
from n as deka cross join n as hecto cross join n as kilo
cross join n as tenK cross join n as hundredK
order by [Date]
)
带条件聚合的rextester演示:
带pivot的rextester演示:
两者都会为我的演示数据返回相同的结果:
select
roomid
, Day1 = [1]
, Day2 = [2]
, Day3 = [3]
, Day4 = [4]
, Day5 = [5]
, Day6 = [6]
, Day7 = [7]
from cte
pivot (min(value) for rn in ([1],[2],[3],[4],[5],[6],[7]))p
编号和日历表参考:
您的输入数据集和预期的输出数据集是什么?你可能不需要一个循环来完成这项工作。你能找一个以英语为母语的人帮你重新写你的问题吗?我不知道你想问什么。你的输入数据集和期望的输出数据集是什么?你可能不需要一个循环来完成这项工作。你能找一个以英语为母语的人帮你重新写你的问题吗?我不知道你想问什么。
+--------+------+------+------+------+------+------+------+
| roomid | Day1 | Day2 | Day3 | Day4 | Day5 | Day6 | Day7 |
+--------+------+------+------+------+------+------+------+
| 2 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
| 3 | 0 | 8 | 8 | 8 | 8 | 0 | 0 |
+--------+------+------+------+------+------+------+------+