获取一天中特定时间的日期时间列中的最大时间?
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()
功能。但是您可以转换为日期并使用小时。
我有一个名为 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()
功能。但是您可以转换为日期并使用小时。