如何计算 SQL Server 2005 中两个日期之间的间隔?
How to Calculate Gap Between two Dates in SQL Server 2005?
我有如图所示的数据集。
我正在尝试获取 eligenddate(第一行)和 eligstartdate(第二行)之间的日期差异。我真的很感激任何建议。
谢谢
SQL2005:
一个解决方案是插入一个 table 变量(@DateWithRowNum - 行数是 small)或插入一个临时变量 table(# DateWithRowNum - 行数为 high) 带有行号的行(使用 [elig]startdate
作为 order by
标准生成;另见注释 #1)加上一个 self因此加入:
DECLARE @DateWithRowNum TABLE (
memberid VARCHAR(50) NOT NULL,
rownum INT,
PRIMARY KEY(memberid, rownum),
startdate DATETIME NOT NULL,
enddate DATETIME NOT NULL
)
INSERT @DateWithRowNum (memberid, rownum, startdate, enddate)
SELECT memberid,
ROW_NUMBER() OVER(PARTITION BY memberid ORDER By startdate),
startdate,
enddate
FROM dbo.MyTable
SELECT crt.*, DATEDIFF(MONTH, crt.enddate, prev.startdate) AS gap
FROM @DateWithRowNum crt
LEFT JOIN @DateWithRowNum prev ON crt.memberid = prev.memberid AND crt.rownum - 1 = prev.rownum
ORDER BY crt.memberid, crt.rownum
另一种解决方案是使用通用 table 表达式而不是 table 变量/临时变量 table 因此:
;WITH DateWithRowNum AS (
SELECT memberid,
ROW_NUMBER() OVER(PARTITION BY memberid ORDER By startdate),
startdate,
enddate
FROM dbo.MyTable
)
SELECT crt.*, DATEDIFF(MONTH, crt.enddate, prev.startdate) AS gap
FROM DateWithRowNum crt
LEFT /*HASH*/ JOIN DateWithRowNum prev ON crt.memberid = prev.memberid AND crt.rownum - 1 = prev.rownum
ORDER BY crt.memberid, crt.rownum
注意 #1:我假设您需要为每个 memberid
计算这些值
注释 #2:HASH 提示强制 SQL 服务器对 LEFT JOIN
.
的每个数据源(crt
或 prev
)仅求值一次
我有如图所示的数据集。 我正在尝试获取 eligenddate(第一行)和 eligstartdate(第二行)之间的日期差异。我真的很感激任何建议。 谢谢
SQL2005:
一个解决方案是插入一个 table 变量(@DateWithRowNum - 行数是 small)或插入一个临时变量 table(# DateWithRowNum - 行数为 high) 带有行号的行(使用 [elig]startdate
作为 order by
标准生成;另见注释 #1)加上一个 self因此加入:
DECLARE @DateWithRowNum TABLE (
memberid VARCHAR(50) NOT NULL,
rownum INT,
PRIMARY KEY(memberid, rownum),
startdate DATETIME NOT NULL,
enddate DATETIME NOT NULL
)
INSERT @DateWithRowNum (memberid, rownum, startdate, enddate)
SELECT memberid,
ROW_NUMBER() OVER(PARTITION BY memberid ORDER By startdate),
startdate,
enddate
FROM dbo.MyTable
SELECT crt.*, DATEDIFF(MONTH, crt.enddate, prev.startdate) AS gap
FROM @DateWithRowNum crt
LEFT JOIN @DateWithRowNum prev ON crt.memberid = prev.memberid AND crt.rownum - 1 = prev.rownum
ORDER BY crt.memberid, crt.rownum
另一种解决方案是使用通用 table 表达式而不是 table 变量/临时变量 table 因此:
;WITH DateWithRowNum AS (
SELECT memberid,
ROW_NUMBER() OVER(PARTITION BY memberid ORDER By startdate),
startdate,
enddate
FROM dbo.MyTable
)
SELECT crt.*, DATEDIFF(MONTH, crt.enddate, prev.startdate) AS gap
FROM DateWithRowNum crt
LEFT /*HASH*/ JOIN DateWithRowNum prev ON crt.memberid = prev.memberid AND crt.rownum - 1 = prev.rownum
ORDER BY crt.memberid, crt.rownum
注意 #1:我假设您需要为每个 memberid
注释 #2:HASH 提示强制 SQL 服务器对 LEFT JOIN
.
crt
或 prev
)仅求值一次