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 |
+--------+------+------+------+------+------+------+------+