sqlserver datetime 类型 时间范围搜索
测试数据库是sql server 2019.
简单创建一个表,只有主键自增id和datetime类型的列。
插入数据
insert into testdb(timecol) values('2020-01-02 00:00:00')
insert into testdb(timecol) values('2020-01-03 23:59:59')
insert into testdb(timecol) values('2020-01-03 23:59:59.993')
insert into testdb(timecol) values('2020-01-03 23:59:59.994')
insert into testdb(timecol) values('2020-01-03 23:59:59.995')
insert into testdb(timecol) values('2020-01-03 23:59:59.996')
insert into testdb(timecol) values('2020-01-03 23:59:59.997')
insert into testdb(timecol) values('2020-01-03 23:59:59.998')
insert into testdb(timecol) values('2020-01-03 23:59:59.999')
select * from testdb;
查询结果如下
image.png
注意,我是连续插入毫秒精度是993到999,数据库显示的结果是不一样。
如上图 可以知道datetime类型的不怎么支持毫秒精度。时间范围 00:00:00 到 23:59:59.997
参考官网: https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-ver15
如果想查询时间范围的内数据,比如说1月3日所有的数据,我们现在采用>= and <=方式来查询(这里不考虑用between and,结果跟>= and <=是一样的)
image.png如上图,由于没写毫秒精度,有些数据查不到了(如图3到8条数据)。而且查询第二天也就是4日的数据也不包含。
当然你可以把精度带上,能实现你想要的结果,如下
image.png
但你可能觉得上面有点啰嗦,可以试试下面的方法采用>= and <方式来查询,可以查询到目标数据。
image.png综上, 推荐用>= and <方式来查询datetime时间范围的数据
如果你对毫秒有要求,可以用datetime2类型的字段
扩展说一下,有些朋友可能会为什么不用函数转换成字符串或日期的数字来比较?只要是sql带有函数效率都会低,这里尽量不要做转换;还有加索引什么的,不是咱本文讨论的范围。