小5聊Sql Server时间转换和查询时间范围查询不正确的原因
Posted 小5聊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小5聊Sql Server时间转换和查询时间范围查询不正确的原因相关的知识,希望对你有一定的参考价值。
最近在做时间方法封装的时候发现了一个问题!
如果sql语句输出的时间字段转为了字符串输出,那么在使用此字段作为时间范围筛选时发现无效了,没法过滤对应的时间范围内记录
下面进行场景重现下
1、创建表
创建只有三个字段的表testTable,自增编号、全球唯一编号Guid、添加时间
create table testTableName
(
id int identity(1,1) primary key,
guidValue nvarchar(50),
createTime datetime
)
2、模拟一个月数据
1)可以写一个sql的循环语句按天模拟添加一个月的数据
2)定义一个整型变量,从0开始,循环30次
3)时间格式化,可以看我写的这篇文章《Sql Server日期格式化大全》
4)除了看时间格式化,还需要对时间进行加减《sql server 查询七天内的数据之时间条件格式化》
5)前一天设置,dateadd(day,-1,getdate())
declare @dayCount int
set @dayCount=0
while @dayCount<=30 begin
insert into testTableName(guidValue,createTime)
values(newid(),dateadd(day,-@dayCount,getdate()))
set @dayCount+=1
end
3、按时间查询
查询2022.12.15到2022.12.19号的记录,正确情况应该是返回5条记录
时间格式用了三个方式,小数点、斜杠、横杠,都可能正确查询出来
- 正确返回
select * from testTableName
where 1=1 and
--createTime>='2022.12.15 00:00:00' and createTime<='2022.12.19 23:59:59'
createTime>='2022/12/15 00:00:00' and createTime<='2022/12/19 23:59:59'
--createTime>='2022-12-15 00:00:00' and createTime<='2022-12-19 23:59:59'
- 错误查询方式 - 小数点格式
- 错误查询方式 - 斜杠格式
- 正确返回 - 横杠格式
select * from(
select id,guidValue,convert(varchar(20),createTime,23) as createTime
from testTableName
) a
where 1=1 and
--createTime>='2022.12.15 00:00:00' and createTime<='2022.12.19 23:59:59'
--createTime>='2022/12/15 00:00:00' and createTime<='2022/12/19 23:59:59'
createTime>='2022-12-15 00:00:00' and createTime<='2022-12-19 23:59:59'
- 作为本身查询没问题
4、总结
1)如果查询字段作为时间范围筛选,那么尽量不要把时间字段转为字符串格式
2)如果时间格式转为字符串,那么不要在子查询外对字符串的时间字段进行时间范围筛选
3)如果要作为时间范围筛选,那么使用yyyy-MM-dd格式进行筛选,否则查询无效
以上是关于小5聊Sql Server时间转换和查询时间范围查询不正确的原因的主要内容,如果未能解决你的问题,请参考以下文章
小5聊Sql Server基础使用之SHOWPLAN permission denied in database
小5聊Sql Server基础之Sql语句文件组分区函数分组方案对应分区表的简单步骤