日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2023/12/8 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)=nullSELECT @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

閃電一般的速度 完美解決隊友的坑 也想解決我的坑隊友

總結

以上是生活随笔為你收集整理的SQL DATENAME(month,getdate())返回的数据为英文日期及把日期转为字符去比较的性能问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。