SQL:我如何找到存在于 30 分钟日期时间范围内的“Created_at”列的数据集记录?

Posted

技术标签:

【中文标题】SQL:我如何找到存在于 30 分钟日期时间范围内的“Created_at”列的数据集记录?【英文标题】:SQL: How can i find the records of a dataset that exist in a datetime range of 30 minutes for a column 'Created_at'? 【发布时间】:2018-04-24 13:27:23 【问题描述】:
SELECT t1.depar_date, t1.return_date, t1.orig_air, t1.dest_air, t1.num_pass, count(t1.id) as count_of, 'TRUE' as Hit_Cache
FROM MY_TEST t1
WHERE  t1.created_at BETWEEN t1.created_at AND dateadd(minute, 30, t1.created_at) --t1.created_at > dateadd(DAY, 1, t1.created_at)
GROUP BY t1.depar_date, t1.return_date, t1.orig_air, t1.dest_air, t1.num_pass
HAVING count(t1.id) > 1;

DATEADD 无法识别并引发错误。

【问题讨论】:

你遇到了什么错误? created_at的类型是什么? 还有什么是数据库引擎sql server or mysql 查询中的这个子句在 SQL Server 上总是会返回 truet1.created_at BETWEEN t1.created_at AND DATEADD(MINUTE, 30, t1.created_at) 在 MySQL 上它会抛出一个错误。请edit您的问题更全面地解释您想要做什么。并且,请删除 [mysql] 或 [sql-server] 标签。 【参考方案1】:

大写MINUTE或使用小写的mm:

SELECT t1.depar_date, t1.return_date, t1.orig_air, t1.dest_air,        t1.num_pass, count(t1.id) as count_of, 'TRUE' as Hit_Cache
FROM MY_TEST t1
WHERE  t1.created_at BETWEEN t1.created_at AND dateadd(MINUTE, 30,     t1.created_at) --t1.created_at > dateadd(DAY, 1, t1.created_at)
GROUP BY t1.depar_date, t1.return_date, t1.orig_air, t1.dest_air, t1.num_pass
HAVING count(t1.id) > 1; 

【讨论】:

【参考方案2】:

因为您的查询在DATEADD() 上出现问题,我猜您正在使用 MySQL。

在我看来,您想知道您的表中有多少其他记录位于每条记录的半小时内。

因为要比较记录与记录,所以需要自联接操作。具体来说,你想要这样的东西

   FROM MY_TEST t1
   JOIN MY_TEST t2 ON something.

这种结构使您看起来像是在查询两个不同的表 t1t2,即使它们是相同的数据。

我认为你的比较看起来像这样

  FROM MY_TEST t1
  JOIN MY_TEST t2 
       ON t2.created_at BETWEEN t1.created_at AND t1.created_at + INTERVAL 30 MINUTE

此连接操作的结果由表中与ON 条件匹配的行对的所有可能组合组成。然后,您继续从这对成对的行中进行选择和汇总。

您查询的其余部分看起来与您的问题非常相似。

SELECT t1.depar_date, t1.return_date, t1.orig_air, 
       t1.dest_air, t1.num_pass, count(t1.id) as count_of,
       'TRUE' as Hit_Cache
  FROM MY_TEST t1
  JOIN MY_TEST t2 
       ON t2.created_at BETWEEN t1.created_at AND t1.created_at + INTERVAL 30 MINUTE
 GROUP BY t1.depar_date, t1.return_date, t1.orig_air, t1.dest_air, t1.num_pass
HAVING count(t1.id) > 1;

也许我猜错了 MySQL。在 SQL Server 中,您的 ON 子句将如下所示。

       ON t2.created_at BETWEEN t1.created_at AND DATEADD(MINUTE, 30, t1.created_at)

【讨论】:

感谢您的回答。我明白你说的是对的,但我仍然对 DATEADD 函数有问题。 MINUTE 参数无法识别。

以上是关于SQL:我如何找到存在于 30 分钟日期时间范围内的“Created_at”列的数据集记录?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 不存在函数

SQL 提取一天中所有未保留的 30 分钟或 60 分钟时间段

简单的日期时间 sql 查询

SQL 如何查询日期在一定范围内的数据

使用 T-SQL 将 OHLC-Stockmarket 数据分组到多个时间范围内

SQL Server 在日期范围内聚合