【小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格式进行筛选,否则查询无效

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈小5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值