我有一个奇怪的是我在SQL Server语句中难以理解。希望有人可以提供帮助。
在返回的事件返回时,查询工作正常,所以我知道所有链接都没问题,我在Select子句中有这个以返回日期:
Select Cast(DATENAME(WEEKDAY, Cast(dbo.TimeZone(Incidents.IncidentDate, Sites.TimeZone) As Date)) As VarChar) As 'IncidentDay',
正确地将星期几作为varchar返回。
我还想让这一天成为Where标准的一部分,所以我将varchar变量@IncidentDay传递给查询并将其添加到Where子句:
Where (@IncidentDay Is Null
Or Cast(DATENAME(WEEKDAY, Cast(dbo.TimeZone(Incidents.IncidentDate, Sites.TimeZone) As Date)) As VarChar) = @IncidentDay)
但是,如果我将值传递给@IncidentDay,则不会返回任何结果。 Cast语句是相同的,我在Where语句的其他位置使用Cast来按日期过滤而没有问题。
任何人都可以解释为什么日间过滤器无效?
感谢。
编辑:到目前为止使用案例的回复对我不起作用,并建议我需要澄清这个问题。
问题是我需要在我的Where子句中有一个条件来比较存储日期的星期几(例如“星期五”)与传递给查询的变量。
Select Cast ..语句正确地将星期几作为varchar返回,但Where子句中的相同Cast ..语句不会针对传递的varchar变量进行评估。我需要检查Null,因为查询也会针对其中不会设置@IncidentDay变量的其他条件进行调用。
答案 0 :(得分:0)
在您使用的查询OR子句中。
如果您的意图是@IncidentDay为null,那么所有记录都应该来,如果@IncidentDay有任何值,那么它应该在该日期值中过滤。然后下面的代码将起作用。
注意:如果没有搜索,你需要在@IncidentDay发送“A”而不是NULL
AND CASE
WHEN @IncidentDay 'A'
THEN 'A'
ELSE Cast(DATENAME(WEEKDAY, Cast(dbo.TimeZone(Incidents.IncidentDate, Sites.TimeZone) AS DATE)) AS VARCHAR)
END = @IncidentDay
答案 1 :(得分:0)
只需使用此
AND Cast(DATENAME(WEEKDAY, Cast(dbo.TimeZone(Incidents.IncidentDate, Sites.TimeZone) AS DATE)) AS VARCHAR) = CASE
WHEN @IncidentDay IS NULL THEN Cast(DATENAME(WEEKDAY, Cast(dbo.TimeZone(Incidents.IncidentDate, Sites.TimeZone) AS DATE)) AS VARCHAR)
ELSE @IncidentDay END
答案 2 :(得分:0)
确保变量定义为varchar(max),而不仅仅是varchar解决了这个问题。
感谢您的评论。
答案 3 :(得分:0)
虽然只在评论中提到过,但您的变量定义如下:
@IncidentDay VARCHAR
这相当于
@IncidentDay VARCHAR(1)
这意味着进入变量的任何内容都会被截断为一个字符。所以'星期四'变成'T',这显然不等于'星期四'
此较小的表达式也应该等同于您当前使用的表达式:
DATENAME(
WEEKDAY,
dbo.TimeZone(Incidents.IncidentDate, Sites.TimeZone)
)
你正在进行大量的多余投射。