SQL Server 2008日期时间转换错误及昨日17点查询需求
解决SQL Server 2008日期转换失败并实现昨日17点数据查询
嘿,我来帮你搞定这个问题!你碰到的“字符串转换为日期和/或时间时转换失败”错误,大概率是因为隐式转换依赖服务器语言环境,或者转换时没指定正确的格式样式导致的。针对你的需求,我给你两种可靠的解决方案,既能避免转换错误,又能精准查询昨日17点开始的数据。
方案一:用日期函数直接构造(推荐,完全避免字符串转换)
这种方法不用碰字符串转换,直接通过SQL Server的日期函数生成昨日17:00:00的起始时间,从根源上杜绝转换错误:
-- 先定义昨日17点的起始时间变量 DECLARE @Yesterday17 DATETIME -- 步骤:1. 获取昨天的日期(不带时间)2. 转成DATETIME类型(默认00:00:00)3. 加上17小时 SET @Yesterday17 = DATEADD(HOUR, 17, CAST(CAST(GETDATE() - 1 AS DATE) AS DATETIME)) -- 执行查询,筛选昨日17点及之后的数据 SELECT * FROM YourTableName -- 替换成你的表名 WHERE YourDateTimeColumn >= @Yesterday17 -- 替换成你的日期时间列名
为什么这个方法靠谱?
CAST(GETDATE() - 1 AS DATE)会精准得到昨天的日期(比如2018-02-05),不带任何时间信息- 再转成
DATETIME类型后,默认是当天的00:00:00 - 最后用
DATEADD加上17小时,直接得到2018-02-05 17:00:00.000,完全不需要字符串拼接和转换,自然不会出错
方案二:字符串转换(需指定正确格式样式)
如果你因为某些场景必须用字符串转换,一定要明确指定转换样式,不能依赖默认设置。SQL Server 2008中,yyyy-mm-dd格式对应的样式代码是23,带时间的yyyy-mm-dd hh:mi:ss对应120,带毫秒的则用121:
-- 构造昨日17点的字符串格式时间 DECLARE @StartDateStr VARCHAR(20) = CONVERT(VARCHAR(10), GETDATE() - 1, 23) + ' 17:00:00' -- 用指定样式转换为DATETIME类型 DECLARE @StartDate DATETIME = CONVERT(DATETIME, @StartDateStr, 120) -- 查询数据 SELECT * FROM YourTableName WHERE YourDateTimeColumn >= @StartDate
输出指定格式的结果
如果需要把查询结果格式化成你要的yyyy-mm-dd hh:mi:ss.mmm样式(比如2018-02-05 17:22:00.000),可以用CONVERT指定样式121:
SELECT YourDateTimeColumn, CONVERT(VARCHAR(23), YourDateTimeColumn, 121) AS FormattedDateTime -- 格式化后的日期 FROM YourTableName WHERE YourDateTimeColumn >= @Yesterday17
关键注意点
- 永远避免隐式转换(比如直接把字符串和日期列比较),服务器的语言/日期格式设置会影响转换结果
- 用
DATE/DATETIME类型的函数操作日期,比字符串转换更高效、更可靠
内容的提问来源于stack exchange,提问作者Rosebud
相关产品推荐
相关产品推荐

