SQL将bigint列转日期设起止参数报TRY_CAST语法错误怎么办
问题根因
你遇到的Msg 102, Level 15, State 1, Line 3 Incorrect syntax near 'TRY_CAST'报错,以及后续逻辑不生效的问题,来自4个写法错误:
SET变量赋值语法缺失等号:T-SQL中给变量赋值必须遵循SET @变量名 = 表达式的格式,你写的set @date1 TRY_CAST(...)漏了=,直接触发语法解析错误。- 变量声明顺序错误:所有
DECLARE变量的语句必须放在所有引用该变量的逻辑之前,你先写SET赋值、后写DECLARE声明,解析阶段SQL引擎根本识别不到@date1、@date2两个变量。 - 字段引用逻辑错误:前两行
SET语句直接引用表字段[DischargeDateKey],但没有关联对应表、没有写SELECT查询逻辑,即使补上等号也会报列名无效错误。 - 日期赋值存在隐式转换风险:直接给
DATETIME类型赋整数值20200101属于隐式转换,不同SQL Server版本、不同语言环境下可能出现转换结果偏差,不是安全写法。
正确实现代码
根据你的需求(起始日期固定为2020年1月1日,结束日期为当前日期,bigint类型的DischargeDateKey是YYYYMMDD格式的日期键),直接使用下面的写法即可:
-- 第一步:先声明所有需要用到的变量,必须放在逻辑最开头 DECLARE @start_date AS DATETIME, @end_date AS DATETIME; -- 第二步:给变量赋值 -- 起始日期固定为2020-01-01,用无歧义的'YYYYMMDD'字符串格式显式转换 SET @start_date = TRY_CAST('20200101' AS DATETIME); -- 结束日期取当前日期,和GETDATE()效果完全一致 SET @end_date = GETDATE(); -- 第三步:后续查询中使用变量,同时把bigint类型的日期键转成日期格式做匹配 SELECT * FROM 你的业务表名 WHERE -- 把bigint日期键转成DATETIME,避免转换失败报错用TRY_CAST兜底 TRY_CAST(CAST([DischargeDateKey] AS VARCHAR(8)) AS DATETIME) BETWEEN @start_date AND @end_date;
可选调整场景
如果你需要从表中DischargeDateKey的实际值取边界,而不是完全用固定起始日期,可以把赋值逻辑改成查询赋值:
DECLARE @start_date AS DATETIME, @end_date AS DATETIME; -- 起始日期取「2020-01-01」和「表中最早的出院日期」两者的较晚值,可根据业务调整规则 SELECT @start_date = CASE WHEN MIN(TRY_CAST(CAST([DischargeDateKey] AS VARCHAR(8)) AS DATETIME)) > TRY_CAST('20200101' AS DATETIME) THEN MIN(TRY_CAST(CAST([DischargeDateKey] AS VARCHAR(8)) AS DATETIME)) ELSE TRY_CAST('20200101' AS DATETIME) END FROM 你的业务表名; SET @end_date = GETDATE();
注意:如果你的SQL Server版本支持DATE类型,优先用DATE代替DATETIME存储纯日期值,存储开销更小、查询效率更高。
内容的提问来源于stack exchange,提问作者David Goldstone
相关产品推荐
相关产品推荐

