请教SQL查询日期和时间不在同一列的区间值的语句怎么写

上周,我的朋友正在编写一个 SQL 查询。
他想过滤2 01 2 年1 2 月1 日0:00到2 01 2 年1 2 月7 日2 3 :5 9 :5 9 之间某个特定表的数据。
他说,由于数据库中的时间是DATETIME格式,所以可以使用…和..之类的函数,也可以使用大于>和小于<符号来表达。
他是对的,我尝试了一下,确实有效。
然而他忘了写最后一个小于号,差点写错。
人们很容易忽视这些小细节。
2 02 3 年,我多次提到过。

SQL查询:如何查找包含多个日期值的字段中特定日期范围的数据?

我记得有一次我在一个项目中遇到了一个严重的问题。
我们有一个记录许多活动开始和结束时间的系统。
这些时间点以逗号分隔的字符串格式存储在字段中。
例如,特定记录的开始时间为“2 02 2 -09 -1 4 1 1 :3 8 :2 1 ,2 02 2 -09 -1 4 1 8 :00:00”。
我需要查找特定日期范围内的活动记录。

我的第一个想法是使用LIKE运算符进行匹配,但这只能找到包含某个日期的活动记录,但无法检测该活动是否发生在该日期范围内。
于是,我开始思考如何解决这个问题。

我的第一个想法是我应该拆分字符串并分别提取每个日期值。
我尝试了 MySQL 中的 SUBSTRING_INDEX 函数。
这个函数帮助我分割用逗号分隔的日期值。
我编写了一个查询来检索记录的第一个和最后一个日期值:
sql 选择 SUBSTRING_INDEX(epr.realstarttime, ',', 1 ) AS start_date, SUBSTRING_INDEX(epr.realstarttime, ',', -1 ) AS end_date 来自 事件计划记录 epr 哪里 epr.realstarttime LIKE '%2 02 2 -09 -1 4 %'
此查询可以查找包含特定日期的活动记录,但这还不够。
我需要检查事件是否在此日期范围内开始和结束。
我开始尝试使用 BETWEEN 运算符,但这需要我编写四个条件:活动开始日期、活动结束日期、日期范围开始日期和日期范围结束日期。

我写了一个这样的查询:
sql 选择 四月 来自 事件计划记录 epr 哪里 (SUBSTRING_INDEX(epr.realstarttime, ',', 1 ) 在 '2 02 2 -09 -1 4 ' 和 '2 02 2 -09 -1 5 ' 之间) OR (SUBSTRING_INDEX(epr.realstarttime, ',', -1 ) 介于 '2 02 2 -09 -1 4 ' 和 '2 02 2 -09 -1 5 ' 之间) OR ('2 02 2 -09 -1 4 ' SUBSTRING_INDEX(epr.realstarttime, ',', 1 ) AND SUBSTRING_INDEX(epr.realstarttime, ',', -1 )) OR ('2 02 2 -09 -1 5 ' SUBSTRING_INDEX(epr.realstarttime, ',', 1 ) AND SUBSTRING_INDEX(epr.realstarttime, ',', -1 ))
这个问题终于满足了我的需求。
但我认为这个方法是可以的,但是效果并不好。
在一个字段中存储多个日期值会影响查询性能。
为了优化数据库设计,我应该考虑将日期值拆分到单独的表中或者使用其他方式来存储这个时间段数据。

等等,还有一件事,不同的数据库系统(例如 PostgreSQL 和 SQL Server)可能具有与我使用的 MySQL 不同的字符串拆分功能。
我突然想到。
我需要使语法适应正确的情况,并确保查询可以在不同的数据库上运行。

sqlserver怎么查询一个时间段内每个小时内的最新一条数

需要明确的是,这个 SQL 需求很常见,但其实现中有一个关键点很容易导致陷阱。
您使用DATEPART函数使时间戳精确到小时,然后使用GROUP BY按小时分组,最后使用ROW_NUMBER()排序并选择每组中最新的数据。

我们先来说最重要的事情:使用DATEPART(hour, YourDateTimeColumn)将时间戳转换为时间戳。
例如,当我们去年运行订单系统时,我们可以使用 DATEPART(hour, OrderTime) 和 CONVERT(varchar, OrderTime, 1 1 2 ) 的组合来获取正确的时间。
另一点是 ROW_NUMBER() 是关键。
它应该按 YourDateTimeColumn 添加 DESC ORDER,以确保选择每组中的最新数据。
例如,在用户行为分析场景中,按事件时间排序可以捕获每小时发生的最后一件事。
还有另一个重要的细节。
不要忘记将 YourDateTimeColumn 添加到 GROUP BY。
否则,SQL Server 会报告错误,用行话来说,这称为语法依赖性。
事实上,正是前面的轻微延迟导致了其余部分的下降。

一开始我以为使用 max(YourDateTimeColumn) 可以解决问题,但后来我意识到这是一个错误,因为你想要获取的是时间,但最大时间戳可以是 2 3 :5 9 ,与 2 2 :00 是同一时间,所以你必须使用 ROW_NUMBER。
等等,还有一件事。
如果数据量特别大,比如千万级以上,建议给时间戳列添加索引,否则时间戳会超时。

我建议你尝试这种结构:首先更改时间戳,然后按时间分组,最后使用 ROW_NUMBER() 选择每组中的最新日期。
注意将时间戳列添加到 GROUP BY 中。
但想象一下,如果他跨越时区或改变时区,这个问题也会改变吗?

sql中between的用法 BETWEEN范围查询的3个边界问题

上周,我的朋友在运行 SQL 查询时遇到了一些问题。
他说,虽然BETWEEN操作符很容易使用,但是如果我们使用不当,它可能会导致问题。
例如,关于准确性问题,我们认识到,如果查询仅指定秒,而时间戳以毫秒为单位是正确的,则会丢失一些毫秒级的数据。
当然,这提醒我,有时我们需要显式指定完整精度或使用大于和小于的组合来避免错误。
我记得有一次,2 02 3 年,它询问了1 8 岁到2 5 岁的工人,数据库将字符串视为数字,导致非数字值报错。
这意味着使用BETWEEN时,必须保证两端的值与列的数据类型匹配,或者使用显式转换函数。

关于NULL值,注意BETWEEN不能直接处理NULL值,查询会忽略这些行。
这让我觉得如果我们想处理 NULL 值,我们应该显式地处理它们。

在时间范围查询方面,BETWEEN容易因边界不精确而出现数据丢失的情况。
例如,请求 2 02 3 年 1 月的订单时,如果您使用“2 02 3 -01 -01 ”和“2 02 3 -01 -3 1 ”之间,则最后一个日期记录将被删除。
我建议使用大于和小于等于的组合,或者明确指定精度上限。

从性能上来说,BETWEEN和大于等于、小于等于没有区别,但是BETWEEN可读性更强,适合简单的范围查询。
对于复杂的逻辑,可能需要组合其他运算符。

最后,使用BETWEEN时,一定要检查数据有效性和类型匹配,时间查询更喜欢使用大于等于和小于组合并显式处理NULL值,以避免意外结果。
我发现这些技巧非常实用,你呢?您遇到过类似的问题吗?