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

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

呼喚遠(yuǎn)方 2019-11-03 04:04:44
標(biāo)題并不能完全反映我的意思,這可能是重復(fù)的。這是一個(gè)很長的版本:給定客人的姓名,他們的注冊日期和他們的退房日期,如何為他們每天作為客人生成一行?例:鮑勃簽入7/14,然后離開7/17。我想要('Bob', 7/14), ('Bob', 7/15), ('Bob', 7/16), ('Bob', 7/17) 作為我的結(jié)果。謝謝!
查看完整描述

3 回答

?
SMILET

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊

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


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;

結(jié)果:


Bob     2011-07-14

Bob     2011-07-15

Bob     2011-07-16

Bob     2011-07-17

大概您需要將此作為一個(gè)集合,而不是單個(gè)成員,因此這里是一種適應(yīng)此技術(shù)的方法:


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!

結(jié)果:


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);



查看完整回答
反對(duì) 回復(fù) 2019-11-04
?
POPMUISE

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊

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


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的計(jì)算非???,因?yàn)椴恍枰?jì)算或排序。但是,您需要確保該表對(duì)于所有時(shí)間段都足夠大。



查看完整回答
反對(duì) 回復(fù) 2019-11-04
  • 3 回答
  • 0 關(guān)注
  • 638 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)