获取一天中特定时间的日期时间列中的最大时间?

Get the max Time in a datetime column for specific Hours in the day?

我有一个名为 SnapshotDate 的专栏,每 30 分钟有一个快照可以追溯到两年前(下面 link 中的此专栏示例)。

当小时为 6 或 15 时,如何在 SnapshotDate 中获取最大分钟(或秒)条目?

注意:30 分钟的间隔已经改变了很多次,所以我不能具体使用 06:50 或 WHERE 子句中的 15:50。

我目前 WHERE DATEPART(hh,ys.SnapshotDate) IN (6,15) 只能获取 0600 或 1500 小时内的 SnapshotDate 条目,但我如何检索这些条目中的最长时间,以便在特定的一天,我只得到两个结果:一个在 06:50,另一个在 15:50

这是一个基于 window 函数的查询,对于数据集中的每一天,它都会为您提供两条记录:6 小时时间段中的最后一条记录和 15 小时时间段中的最后一条记录:

SELECT *
FROM (
    SELECT 
        t.*,
        ROW_NUMBER() OVER(
            PARTITION BY YEAR(SnapshotDate), MONTH(SnapshotDate), DAY(SnapshotDate), DATEPART(hh, SnapshotDate) 
            ORDER BY SnapshotDate DESC
        ) rn
    FROM mytable
    WHERE DATEPART(hh, SnapshotDate) IN (6, 15)
) WHERE rn = 1

如果你只想要整个table(而不是每天)的6h时间段最大时间记录和15h时间段最大时间记录,那么你可以只需删除 PARTITION 子句:

SELECT *
FROM (
    SELECT 
        t.*,
        ROW_NUMBER() OVER(ORDER BY SnapshotDate DESC) rn
    FROM mytable
    WHERE DATEPART(hh, SnapshotDate) IN (6, 15)
) WHERE rn = 1

为此我推荐 row_number(),因为:

select t.*
from (select t.*,
             row_number() over (partition by convert(date, snapshotdate), datepart(hour, snapshotdate)
                                order by snapshotdate desc
                               ) as seqnum
      from t
      where datepart(hour, snapshot) in (6, 15)
     ) t
where seqnum = 1;

不幸的是,SQL 服务器没有任何类型的 date_trunc() 功能。但是您可以转换为日期并使用小时。