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 上总是会返回 true :t1.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.
这种结构使您看起来像是在查询两个不同的表 t1
和 t2
,即使它们是相同的数据。
我认为你的比较看起来像这样
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 提取一天中所有未保留的 30 分钟或 60 分钟时间段