使用SQL查找倒数第二个日期

时间:2017-11-20 20:16:06

标签: sql sql-server

我正在尝试使用以下查询找到倒数第二个日期以获取所有唯一日期。

SELECT DISTINCT CAST(Entrydatetime AS DATE)
FROM   [table_name]

返回

2017-11-15
2017-11-16
2017-11-17
2017-11-20

[table_name]包含许多行,其中许多行都在上面列出的相同日期。 (200个记录'2017-11-20',180个记录'2017-11-17'等。)

那么有没有办法从上面的查询中获取第二个到最后一个项目?

如果这是一个数组我可以做'$ array [-2]'

之类的事情

所以在这种情况下它会拉2017-11-17。

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:2)

您可以使用ROW_NUMBER对日期进行排名:

select dt
from
(
  select distinct 
    cast(entrydatetime as date) as dt,
    row_number() over (order by cast(entrydatetime as date) desc) as rn
  from table_name
) ranked
where rn = 2;

答案 1 :(得分:0)

如果使用SQL Server,则可以使用以下查询:

with cte as
(
select DISTINCT Convert(Date,Entrydatetime) ,
ROW_NUMBER() over (order by Convert(Date,Entrydatetime) DESC) as rn
from [table name]
) 
select * from cte where rn=2

或者你可以采取另一种方式

SELECT MAX(Convert(Date,Entrydatetime)) 
FROM [table name] 
WHERE Convert(Date,Entrydatetime) < (SELECT MAX(Convert(Date,Entrydatetime) ) FROM [table name])

答案 2 :(得分:0)

以下是使用CTE的示例。我认为迄今为止必须采用DISTINCT EntryDate来消除时间 - 然后应用rownumber。注意我在2017-11-20,12:00:00和13:00:00使用两个不同的时间。如果您在选择中有DISTINCT,则ORDER BY无法正确执行此操作...此需要子查询。

DECLARE @tablename TABLE (Entrydatetime datetime)
INSERT INTO @tablename VALUES ('2017-11-15 12:00:00')
                             ,('2017-11-16 12:00:00')
                             ,('2017-11-17 12:00:00')
                             ,('2017-11-20 12:00:00')
                             ,('2017-11-20 13:00:00')
;
WITH cte AS
(
SELECT ROW_NUMBER() OVER(ORDER BY EntryDate DESC) [theOrder]
      ,dT.EntryDate
  FROM (
         SELECT DISTINCT CAST(Entrydatetime as date) AS EntryDate
           FROM @tablename
       ) AS dT
)

SELECT cte.EntryDate FROM cte WHERE theOrder = 2

提供输出:

EntryDate
2017-11-17