如何计算 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.

的每个数据源(crtprev)仅求值一次