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'
如果我理解正确,您希望:
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或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
{}
),以很好地格式化和语法突出显示它!