SQL:为最接近特定时间的每一天选择一条记录

标签 sql datetime postgresql

我有一个表,其中存储了一个时间点的值:

CREATE TABLE values
(
    value DECIMAL,
    datetime DATETIME 
)

每一天可能有多个值,也可能某一天只有一个值。现在我想获取给定时间跨度(例如一个月)中最接近一天中给定时间的每一天的值。如果这一天有记录,我只想每天获得一个值,如果没有记录,我只想获得一个值。我的数据库是 PostgreSQL。我很坚持这一点。我可以只获取时间跨度中的所有值并以编程方式为每一天选择最接近的值,但这意味着要从数据库中提取大量数据,因为一天可能有很多值。

(更新)

将其表述得更抽象一点:我有任意精度的数据(可能是一分钟,可能是两小时或两天),我想将其转换为一天的固定精度,具体时间为一天。

(第二次更新)

假设所需时间是 16:00,这是来自已接受答案的查询,具有正确的 postgresql 类型转换:

SELECT datetime, value FROM values, (
  SELECT DATE(datetime) AS date, MIN(ABS(EXTRACT(EPOCH FROM TIME '16:00' - CAST(datetime AS TIME)))) AS timediff
  FROM values
  GROUP BY DATE(datetime)
  ) AS besttimes
WHERE 
CAST(values.datetime AS TIME) BETWEEN TIME '16:00' - CAST(besttimes.timediff::text || ' seconds' AS INTERVAL)
                                AND TIME '16:00' + CAST(besttimes.timediff::text || ' seconds' AS INTERVAL) 
                                AND DATE(values.datetime) = besttimes.date

最佳答案

朝这个方向发展怎么样?

SELECT values.value, values.datetime
FROM values,
( SELECT DATE(datetime) AS date, MIN(ABS(_WANTED_TIME_ - TIME(datetime))) AS timediff
  FROM values
  GROUP BY DATE(datetime)
) AS besttimes
WHERE TIME(values.datetime) BETWEEN _WANTED_TIME_ - besttimes.timediff
                                AND _WANTED_TIME_ + besttimes.timediff
AND DATE(values.datetime) = besttimes.date

我不确定日期/时间提取和 abs(time) 函数,因此您可能必须替换它们。

关于SQL:为最接近特定时间的每一天选择一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3759743/

相关文章:

c# - 使用 DateTime.ParseExact C# 未将字符串识别为有效的 DateTime

postgresql - go-pg - 读取更新后返回的 ID

mysql - mysql如何先执行limit,再执行order?

sql - 如何插入带有子查询的多行作为值之一?

用于返回时间轴结果集的 Sql 查询

c# - 在 C# 中计算自 1970 年以来的毫秒数产生与 JavaScript 不同的日期

python - 如何将时间戳转换为 HH :MM:SS format using python and graph the information?

postgresql - Postgres 中是否有与 Oracle 的 user_role_privs View 等效的 View ?

postgresql - 更改现有表的填充因子

sql - 删除表某列中后续的重复字符串