SQL 返回最近的日期和时间戳

Posted

技术标签:

【中文标题】SQL 返回最近的日期和时间戳【英文标题】:SQL return most recent date & time stamp 【发布时间】:2020-05-10 23:14:45 【问题描述】:

我有以下数据,需要查看操作等于“已使用”的最近日期:

CAT STAMP               ACTION
A   05/12/2019 00:13    USED
A   05/12/2019 07:56    USED
A   05/12/2019 09:05    NEW
A   05/12/2019 10:46    NEW
B   20/12/2019 20:50    USED
B   13/01/2020 14:50    USED
B   10/01/2020 22:39    NEW
B   05/12/2019 12:04    NEW

对于以上内容,我需要它返回:

A   05/12/2019 07:56    USED
B   13/01/2020 14:50    USED

对于每个“猫”,每天可能有数百个条目,它需要回顾几年,只返回最近的条目。尝试过 MAX 功能,但由于日期格式的原因,认为它不起作用。

【问题讨论】:

请用您正在使用的数据库标记您的问题。另外,以防万一:stamp 列的数据类型是什么? 【参考方案1】:

一种方法是使用相关子查询进行过滤:

select t.*
from mytable t
where 
    t.action = 'USED'
    and stamp = (
        select max(t1.stamp) 
        from mtable t1 
        where t1.cat = t.cat and t1.action = t.action
    )

另一个典型的解决方案是反left join模式:

select t.*
from mytable t
left join mytable t1
    on  t1.cat = t.cat
    and t1.action = t.action
    and t1.stamp > t.stamp
where t.action = 'USED' and t1.cat is null

两种解决方案都假定stamp 存储在类似date 的数据类型中。如果不是,那么您需要一个额外的步骤来将字符串转换为日期。

【讨论】:

【参考方案2】:

你可以使用子查询:

select t.*
from table t 
where t.action = 'used' and
      t.stamp = (select max(t2.stamp) from table t1 where t1.stamp = t.stamp)

【讨论】:

【参考方案3】:

听起来 stamp 被存储为 varchar 而不是 datetime。先试试CAST

SELECT cat, MAX(CAST stamp AS DateTime) as MxDate, 'used' as Action
FROM mytable
WHERE Action = 'used'
GROUP BY cat

【讨论】:

【参考方案4】:

这将是:

select t.*
from t 
where t.stamp = (select min(t2.stamp)
                 from table t2
                 where t2.cat = t.cat and t2.action = 'used' 
                );

注意过滤是在子查询中。

或者,也许更简单的是:

select t.cat, max(t.stamp)
from t
where t.action = 'used'
group by t.cat;

但是,这不允许您返回其他列。

【讨论】:

以上是关于SQL 返回最近的日期和时间戳的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Netezza 中比较日期?

sql怎么计算时间差

SQL Server 默认日期时间戳?

Selenium webdriver-获取性能日志-未知日期时间戳(12345.12345)

在oracle 10g sql plus中将日期和时间插入时间戳

BigQuery 日期和时间函数在时间戳列上返回 NULL