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

那天,在咖啡馆坐在我旁边的那个人正在电脑屏幕前挠头。
屏幕上有一张表格,上面写着混乱的日期。
他嘟囔着说要过滤特定月份的加班记录。
我的手在颤抖,SQL语句中的日期格式是英文写的。
结果完全错误。
等一下,他使用的是旧版本的 SQL,甚至还不支持 DATETIME2
例如,上次我帮同事调试时,她2 008 年的系统中使用的日期函数与现在完全不同。
运行查询很长时间后,我发现“2 02 3 -1 2 -2 5 ”硬转换为“2 5 /1 2 /2 02 3 ”,这是格式错误的。
要指定格式,您需要添加显式转换:CONVERT(char(1 0), date field, 2 3 )。
即使在今天,仍然有人使用这种书写兼容性的方法。

扩展内容:DateDiff函数很容易使用,但有一个小问题。
上次计算3 0天内的数据,我以为是<3>不然我就错过最后一天了。
具体一看,事情发生在2 02 2 年3 月,一个等号的缺失让我在一个特定的网络环境中卡了半天。

最令人惊讶的是BETWEEN,一个封闭的间隙!一个菜鸟写了>2 01 0-01 -01 AND <2>一定要写成>=... AND <=....这一课是2 01 9 年战队新秀训练会上总结的。

突然想到现在很多新系统直接使用ISO 8 6 01 ,YYYY-MM-DD,不需要转换格式。
然而,在遗留系统中,比如我上次购买的 2 005 年的 ERP,日期字段仍然是老式的 YYYYMMDD 整数类型,所以在查询时,必须使用 SUBSTRING(datefield, 5 , 2 ) 来获取月份。
具体来说,这是上海分行的数据。
该查询运行了 3 个小时,CPU 利用率飙升至 9 5 %。

有一种特别有用的 SQL 技术在参考资料中没有提到。
要过滤特定季度,例如第三季度,可以使用 CASE WHEN MONTH (日期字段) BETWEEN 7 AND 9 THEN 1 ELSE 0 END,结果记录等于 1 我在杭州有一个项目,客户要求提供季度统计数据。
我花了整个下午和三杯咖啡来写这个函数。

说实话,这些小细节——DatePart的使用、BETWEEN的闭区间函数、系统对CONVERT函数支持的差异——真的不是读几篇文档就能解决的。
为了找到答案,您必须在运行数百GB数据的旧服务器上进行实际调试。
这立即引起了轰动,因为坐在我旁边的人意识到了这一点,并将 CONVERT(char(8 ), date field, 1 08 ) 更改为 CONVERT(DATE, date field, 1 1 2 )。
但我忘记了我的系统根本不支持1 1 2 ,所以我最终使用临时表先转换格式...
嘿,我突然意识到为什么他们总是说你需要反复练习SQL。
那是因为角落里的洞太多了。
例如,对于DateDiff,有人写了<7>具体来说,2 02 1 年冬天,我帮助北京的一个客户更改了他们的报告。
改了三个版本后,客户认为我无能。
终于,我发现它是DateDiff的整数结果,小数位被截断...
所以当你写SQL时你不能只阅读文档。
就像时钟一样,你必须修理它,拧紧螺丝,并一一尝试其功能。
与当前查询类似,Convert(char(8 ), date field, 1 08 ) 转换为 2 4 小时格式,但这需要更改,因为有人使用 Convert(char(7 ), ...) 并且结果缺少冒号。
你说这个系统是哪一年写的?虽然注释是2 01 7 年的,但实际使用中还是可能会出现问题,比如2 02 3 年1 0月。

参考资料中的GETDATE()、DATEPART()、CONVERT()函数单独看起来不错,但组合起来就变得复杂了。
我有一个测试环境。
将所有日期格式更改为ISO 8 6 01 因此,生产环境仍然使用旧格式,数据不一致。
具体来说,上个月我花了一周时间重新运行所有相关报告。

所以现在我可以在编写 SQL 时轻松记笔记。
例如,如果一个系统使用转换 (char(1 0), ..., 2 3 ),而另一个系统使用转换 (varchar(1 0), ..., 1 2 0),请注意这一点。
就像坐在我旁边的人一样,他使用 Convert(char(8 ), ..., 1 08 ) 转换为 2 4 小时格式,但有些人使用 Convert(char(7 ), ..., 1 08 ) 使用冒号转换为 1 2 小时格式。
您认为为什么有这么多不同的日期格式?

如何在sql中查询指定日期范围内的数据?

嘿嘿,关于使用SQL查询某个日期范围内的数据,这是我在问答论坛圈子里经常被问到的问题。
坦率地说,BETWEEN 运算符简直就是这个领域的一个神器。
我第一次接触BETWEEN操作符是在2 01 1 年。
我加入这个俱乐部的时候是2 01 5 年,当时数据库仍然使用MySQL。
当时有一个客户想要查看2 01 5 年3 月到2 01 5 年5 月期间的客户订单信息,所以我教他们如何使用BETWEEN。

语法结构非常简单,像这样:
sql 从开始日期和结束日期之间的表名称中选择日期字段,
表名、日期字段、开始日期、结束日期,这些关键字应该替换为真实内容。

我记得有一次,我的一个新手朋友来拜访我。
它说日期格式不正确。
经检查,数据库中的日期字段是日期类型,但写入的是字符串。
两人不般配,自然就出了问题。
当时我就得解释一下,日期格式必须和数据库中的格式一致,不能马虎。

另一点是包括边界值。
包括之间的边界 即,如果输入“2 02 3 -01 -01 ”和“2 02 3 -07 -01 ”,则将包括 2 02 3 年 1 月 1 日和 2 02 3 年 7 月 1 日的数据。

例如,我之前有一个项目。
表中有一个“订单日期”字段。
一旦客户想要查询2 02 3 年1 月1 日到2 02 3 年7 月1 日之间的订单信息,我会帮他们这样写:
sql 选择“2 02 3 -01 -01 ”和“2 02 3 -07 -01 ”之间的订单日期;
走这条路后,这个日期范围内的所有订单都会发出。
但说起来,我不得不承认我的知识可能有点过时了。
新数据库的语法和数据格式可能略有不同,所以我记得数据在X区域,但我建议你检查一下。

一般来说,使用 BETWEEN 运算符对于查询日期范围内的数据非常实用,但请注意细节,不要让格式问题妨碍您。

SQL 日期函数如何判断日期是否在区间内?

上周 我的朋友问我关于 SQL 日期范围的问题
他当时正在使用 MySQL 查看 2 02 3 年 7 月 1 日至 7 月 3 1 日期间的订单
使用 BETWEEN
SELECT FROM Orders WHERE order_date BETWEEN '2 02 3 -07 -01 ' AND '2 02 3 -07 -3 1 ';
结果不匹配的日子 例如,7 月1 日上午8 :00下的订单 或7 月3 1 日晚上1 0点下单 都被发现了
后来我提醒他 您必须使用 >= 和 <=
SELECT FROM order WHERE order_date >= '2 02 3 -07 -01 ' AND order_date <= '2 02 3 -07 -3 1 2 3 :5 9 :5 9 ';
一切都很好
他还问我如何将时间戳转换为日期 我只是说使用 DATE() 函数
作为 DATE(created_at) 您可以将 DATETIME 转换为纯日期
如果它持续数月,请小心。
比如查6 月3 0日到7 月1 日的记录
如果直接写 WHERE CREATED_AT >= '2 02 3 -06 -3 0' AND CREATED_AT <= '2 02 3 -07 -01 '
6 月 3 0 日晚上 1 1 :5 9 :5 9 的记录将丢失
必须写为 WHERE create_at >= '2 02 3 -06 -3 0 00:00:00' Andcreated_at <= '2 02 3 -07 -01 2 3 :5 9 :5 9 '
他听懂了就跑了
其实这是一个数据库 关键是要自己多做几次 只有这样你才能记住这些陷阱
忘记它 不管怎样,跑得越多越好。