sqlserver datetime 类型 时间范围搜索

2021-08-10  本文已影响0人  Sunday_1024

测试数据库是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带有函数效率都会低,这里尽量不要做转换;还有加索引什么的,不是咱本文讨论的范围。

上一篇下一篇

猜你喜欢

热点阅读