0

我已经在我之前的问题帖子中问过这个问题 打印日期范围之间的当前值和以前的值 但是这次我想更具体地了解这里的日期范围。

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

    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

我想要以下日期范围(01-04-2010 到 01-06-2010)之间的所有 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: DATE 是 DATE 格式和 MS SQL

如果有人能对此发表意见,我将不胜感激。谢谢你的时间。

4

2 回答 2

0

尝试使用SET DATEFORMAT ymd下面的 and 查询:

DATEFORMAT ymd

SELECT customerName 
FROM dbo.customer 
WHERE insertedDate BETWEEN '2010-04-01 'AND '2010-06-01'
于 2012-05-27T18:01:09.910 回答
0

如果我理解正确,你想要:

  1. 状态在指定范围内的任何 ID,以及
  2. 最近的活动状态不在

在这里,我正在调用您的源表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
于 2012-05-27T18:22:32.727 回答