SQL DATENAME(month,getdate())返回的数据为英文日期及把日期转为字符去比较的性能问题

最近 和一个同事一同开发一个电商项目 项目收尾写报表的时候 队友可把我坑惨了
首先是SQL SERVER DATENAME()这个方法的坑
再次是一个日期的性能问题

1.DATENAME(month,getdate())在数据库脚本运行环境为中文的时候返回01、02的数据,运行环境为英文的时候返回may这样的英文日期缩写
报表按月查询 界面大概就长这个样子 传去存储的参数:@time=‘202005’

在这里插入图片描述
既然只说时间的问题
定义一个订单表Orders如下:

CREATE TABLE [dbo].[Orders](
	[OrderID] [int] IDENTITY(1,1) NOT NULL,  --订单号
	[AddTime] [datetime] NULL  --订单时间
)

当时我们的开发环境和测试环境的数据库脚本执行语言是中文的 线上却是英文的
导致以下惨剧:
sql语句如下:

declare @time varchar(20)=‘202005’
select COUNT(*) from Orders 
WHERE DATENAME(YEAR,AddTime)+DATENAME(MONTH,AddTime) =@time

开发环境数据库:

在这里插入图片描述
线上环境数据库:

在这里插入图片描述
坑爹啊 数据全挂了
后面试了下:

set language  'Simplified Chinese'
declare @time varchar(20)=‘202005’
select COUNT(*) from Orders 
WHERE DATENAME(YEAR,AddTime)+DATENAME(MONTH,AddTime) =@time

把脚本的运行环境改为中文 但是返回特别卡
我以为这样设置不行 实际上是可以的(就是卡)
后面又换种写法:

declare @time varchar(20)='202005'
select COUNT(*) from Orders 
--WHERE substring(CONVERT(varchar(100),AddTime, 112),0,7)=@time 
WHERE RIGHT(CONVERT(varchar(100),AddTime, 112),6)=@time

但是还是超级卡 那就是性能问题了

2.把日期转为字符去比较的性能问题
把数据库的日期类型字段转成字符去比较性能会变的超级差 而且也利用不了索引 最后换成这种方法:
declare  @time varchar(20)='202005',@startTime varchar(50)=null,@endTime varchar(50)=null

SELECT @startTime= substring(@time,0,5)+'-'+substring(@time,5,2)+'-'+'01'
SELECT @endtime=CONVERT(VARCHAR(7),DATEADD(MONTH, 1, @startTime),121)+'-01'

select COUNT(*) from Orders 
WHERE  AddTime>@startTime and AddTime<@endTime

闪电一般的速度 完美解决队友的坑 也想解决我的坑队友

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值