You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:40:55