SQL中Case语句失效问题:按BookInDT计算test1列值需求
问题分析与解决方案
你当前test1列的Case语句条件和实际需求完全不符,这就是条件看似被“忽略”的核心原因。按照你提出的需求——当BookInDT早于02/01/2023时取值为28,否则取BookInDT与@EndDate的日期间隔,以下是修正后的代码及说明:
修正后的完整SQL代码
DECLARE @StartDate datetime , @EndDate datetime ----First Day of Last Month SET @StartDate = DATEADD(mm,-1,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)) --First Day of Last Month --First Day of Current Month SET @EndDate = DATEADD(mm, DATEDIFF(m,0,GETDATE()),0) SELECT CONVERT(VARCHAR(10), b.BookInDT, 101) AS [BookInDT], CONVERT(VARCHAR(10), o.AwareDT, 101) AS [DT ICE Hold], case when (dbo.fn_IsInJailByBookInID(b.BookInID)) = 1 then 'yes' else 'no' end as [InJail] , traa.AgencyName AS [Agency Name], CONVERT(VARCHAR(10), r.ReleasedDT, 101) AS [ReleaseDT], DATEDIFF (day, b.bookindt, @enddate) as [Total Days InJail], DATEDIFF (day, @StartDate, @EndDate) AS [Days InJail for Month], -- 修正后的test1列逻辑 case when b.BookInDT < CONVERT(datetime, '02/01/2023', 101) then 28 else DATEDIFF(day, b.BookInDT, @EndDate) end as [test1] FROM ...
关键说明
- 原Case语句的条件
b.bookindt = @enddate几乎不会匹配(仅当BookInDT恰好是当月第一天0点整时才触发),所以看起来像是条件被忽略,实际是没有符合条件的行触发该分支。 - 日期比较时用
CONVERT(datetime, '02/01/2023', 101)显式指定格式(101代表mm/dd/yyyy),可避免因数据库语言、日期格式设置导致的解析错误;也可以直接用ISO标准日期格式'2023-02-01',兼容性更强。
内容的提问来源于stack exchange,提问作者jr7138
相关产品推荐
相关产品推荐

