第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在SQL Server中生成日期范圍

如何在SQL Server中生成日期范圍

拉風的咖菲貓 2019-10-12 09:37:56
標題并不能完全反映我的意思,這可能是重復的。這是一個很長的版本:給定客人的姓名,他們的注冊日期和他們的退房日期,如何為他們每天作為客人生成一行?例:鮑勃簽入7/14,然后離開7/17。我想要('Bob', 7/14), ('Bob', 7/15), ('Bob', 7/16), ('Bob', 7/17) 作為我的結果。謝謝!
查看完整描述

3 回答

?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

我認為,為此特定目的,以下查詢與使用專用查找表一樣有效。


DECLARE @start DATE, @end DATE;

SELECT @start = '20110714', @end = '20110717';


;WITH n AS 

(

  SELECT TOP (DATEDIFF(DAY, @start, @end) + 1) 

    n = ROW_NUMBER() OVER (ORDER BY [object_id])

  FROM sys.all_objects

)

SELECT 'Bob', DATEADD(DAY, n-1, @start)

FROM n;

結果:


Bob     2011-07-14

Bob     2011-07-15

Bob     2011-07-16

Bob     2011-07-17

大概您需要將此作為一個集合,而不是單個成員,因此這里是一種適應此技術的方法:


DECLARE @t TABLE

(

    Member NVARCHAR(32), 

    RegistrationDate DATE, 

    CheckoutDate DATE

);


INSERT @t SELECT N'Bob', '20110714', '20110717'

UNION ALL SELECT N'Sam', '20110712', '20110715'

UNION ALL SELECT N'Jim', '20110716', '20110719';


;WITH [range](d,s) AS 

(

  SELECT DATEDIFF(DAY, MIN(RegistrationDate), MAX(CheckoutDate))+1,

    MIN(RegistrationDate)

    FROM @t -- WHERE ?

),

n(d) AS

(

  SELECT DATEADD(DAY, n-1, (SELECT MIN(s) FROM [range]))

  FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])

  FROM sys.all_objects) AS s(n)

  WHERE n <= (SELECT MAX(d) FROM [range])

)

SELECT t.Member, n.d

FROM n CROSS JOIN @t AS t

WHERE n.d BETWEEN t.RegistrationDate AND t.CheckoutDate;

----------^^^^^^^ not many cases where I'd advocate between!

結果:


Member    d

--------  ----------

Bob       2011-07-14

Bob       2011-07-15

Bob       2011-07-16

Bob       2011-07-17

Sam       2011-07-12

Sam       2011-07-13

Sam       2011-07-14

Sam       2011-07-15

Jim       2011-07-16

Jim       2011-07-17

Jim       2011-07-18

Jim       2011-07-19

正如@Dems指出的那樣,這可以簡化為:


;WITH natural AS 

(

  SELECT ROW_NUMBER() OVER (ORDER BY [object_id]) - 1 AS val 

  FROM sys.all_objects

SELECT t.Member, d = DATEADD(DAY, natural.val, t.RegistrationDate) 

  FROM @t AS t INNER JOIN natural 

  ON natural.val <= DATEDIFF(DAY, t.RegistrationDate, t.CheckoutDate);


查看完整回答
反對 回復 2019-10-12
?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

我通常在某些表上使用row_number()來達到目的。所以:


select t.name, dateadd(d, seq.seqnum, t.start_date)

from t left outer join

     (select row_number() over (order by (select NULL)) as seqnum

      from t

     ) seq

     on seqnum <= datediff(d, t.start_date, t.end_date)

seq的計算非???,因為不需要計算或排序。但是,您需要確保該表對于所有時間段都足夠大。


查看完整回答
反對 回復 2019-10-12
  • 3 回答
  • 0 關注
  • 583 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號