Sql server 打印日期范围内的记录,如果不在日期范围内,则打印最后一条记录

Sql server 打印日期范围内的记录,如果不在日期范围内,则打印最后一条记录,sql-server,sql-server-2008,sql-server-2005,Sql Server,Sql Server 2008,Sql Server 2005,我在上一篇发帖中问过这个问题 但这一次我想更具体地说明一下这里的日期范围 如您所见,我有以下数据集: ID DATE TIME STATUS --------------------------------------------- A 01-01-2000 0900 ACTIVE A 05-02-2000 1000 INACTIVE A 01-07-2

我在上一篇发帖中问过这个问题 但这一次我想更具体地说明一下这里的日期范围

如您所见,我有以下数据集:

    ID     DATE           TIME     STATUS 
    ---------------------------------------------
    A      01-01-2000     0900     ACTIVE 
    A      05-02-2000     1000     INACTIVE 
    A      01-07-2000     1300     ACTIVE 
    B      01-05-2005     1000     ACTIVE 
    B      01-08-2007     1050     ACTIVE
    C      01-01-2010     0900     ACTIVE
    C      01-05-2010     0800     INACTIVE
    C      01-07-2010     1900     ACTIVE
我想要以下日期范围(2010年4月1日至2010年6月1日)之间的所有ID。输出应为:

ID     DATE           TIME     STATUS 
---------------------------------------------
A      01-07-2000     1300     ACTIVE 
B      01-08-2007     1050     ACTIVE
C      01-01-2010     0900     ACTIVE 
C      01-05-2010     0800     INACTIVE
这个想法是,如果您看到每个ID的最后一条记录,不管它是否属于该日期范围,因为我希望状态显示自该特定日期以来,ID=A状态没有更改。此外,如果您看到ID=C,则日期属于日期范围,因此应同时打印这两个日期

PS:日期为日期格式,采用MS SQL


如果有人能对此发表看法,我将不胜感激。谢谢您的时间。

尝试使用
设置日期格式ymd
并在下面查询:

DATEFORMAT ymd

SELECT customerName 
FROM dbo.customer 
WHERE insertedDate BETWEEN '2010-04-01 'AND '2010-06-01'

如果我理解正确,您希望:

  • 状态在指定范围内的任何ID,以及
  • 最近的活动状态不在
  • 在这里,我调用您的源表
    STATS

    DECLARE @START DATE = '1/4/2010';
    DECLARE @END DATE = '1/6/2010';
    
    ; WITH a AS (
        SELECT *,r=ROW_NUMBER()OVER(PARTITION BY [ID],[STATUS] ORDER BY [DATE] DESC, [TIME] DESC)
        FROM [STATS]
    )
    SELECT [ID], [DATE], [TIME], [STATUS] FROM a
    WHERE [DATE] BETWEEN @START AND @END
    
    UNION
    
    SELECT [ID], [DATE], [TIME], [STATUS] FROM a
    WHERE [STATUS]='ACTIVE'
    AND r=1;
    
    结果:

    ID   DATE       TIME STATUS
    ---- ---------- ---- ----------------
    A    2000-01-07 1300 ACTIVE
    B    2007-01-08 1050 ACTIVE
    C    2010-01-05 0800 INACTIVE
    C    2010-01-07 1900 ACTIVE
    

    这将打印指定日期之间的日期范围。。。但是我想要每个身份证的最后一条记录。。请参阅问题欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
    {}
    ),以很好地格式化和语法突出显示它!