SQL:如何查找30分钟日期时间范围内的“Created_at”列的数据集记录?
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
不会被识别并引发错误。SQL:如何查找30分钟日期时间范围内的“Created_at”列的数据集记录?
大写分钟小写使用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;
这不起作用。 –
由于您的查询上DATEADD()
gacked我猜你是使用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参数不被识别。 –
你有什么错误? 'created_at'的类型是什么? –
还有什么是数据库引擎的SQL Server或MySQL? – doganak
查询中的这个子句总是会在SQL Server上返回** true **:'t1.created_at BETWEEN t1.created_at AND DATEADD(MINUTE,30,t1.created_at)'在MySQL上它会抛出一个错误。请[编辑]你的问题来更全面地解释你想要做的事情。并且,请删除[mysql]或[sql-server]标签。 –