MSSQL中能否对datetime用LEFT()函数?查询无结果求助
MSSQL中用LEFT()处理datetime字段筛选日期无结果的问题
问题描述
在MSSQL中尝试用LEFT()函数处理datetime类型的Rueckmeldedatum字段,想要筛选日期为'2023-01-27'的记录,但执行以下SQL语句未得到预期的第20条记录:
SELECT TOP (1000) [KNR] ,[Rueckmeldedatum] FROM [Fertigung].[dbo].[Box1Auswertung] WHERE LEFT(Rueckmeldedatum,10) ='2023-01-27'
想知道是否可以对datetime类型使用LEFT()函数,以及如何解决查询无结果的问题。
解答
1. 能不能对datetime类型用LEFT()函数?
可以用,但非常不推荐。LEFT()是字符串处理函数,当你传入datetime类型值时,SQL Server会自动把datetime隐式转换成字符串,但转换后的格式完全取决于当前会话的语言、日期格式设置——比如有的环境会转成MM/DD/YYYY,有的是DD.MM.YYYY,不一定是你预期的YYYY-MM-DD。这就导致你截取前10位的结果和目标字符串不匹配,查不到数据。
2. 正确的日期筛选方法
直接针对datetime类型做日期匹配,别绕字符串转换,推荐几种靠谱写法:
方法一:转成DATE类型比较
把datetime字段转成DATE类型(只保留日期部分),再和目标日期对比:
SELECT TOP (1000) [KNR] ,[Rueckmeldedatum] FROM [Fertigung].[dbo].[Box1Auswertung] WHERE CAST(Rueckmeldedatum AS DATE) = '2023-01-27'
方法二:用日期范围筛选(性能最优)
指定目标日期的起始和结束时间,这种写法能利用字段上的索引,查询效率更高:
SELECT TOP (1000) [KNR] ,[Rueckmeldedatum] FROM [Fertigung].[dbo].[Box1Auswertung] WHERE Rueckmeldedatum >= '2023-01-27' AND Rueckmeldedatum < '2023-01-28'
方法三:用日期函数提取日期部分
通过DATEADD和DATEDIFF组合,精准提取datetime的日期部分,避免隐式转换问题:
SELECT TOP (1000) [KNR] ,[Rueckmeldedatum] FROM [Fertigung].[dbo].[Box1Auswertung] WHERE DATEADD(day, DATEDIFF(day, 0, Rueckmeldedatum), 0) = '2023-01-27'
3. 原语句查不到结果的原因
你的会话日期格式大概率不是YYYY-MM-DD,比如如果是dd.MM.yyyy,那么LEFT(Rueckmeldedatum,10)得到的是27.01.2023,和你写的'2023-01-27'完全不相等,自然查不到预期记录。
内容的提问来源于stack exchange,提问作者user20356767
相关产品推荐
相关产品推荐

