SQL Cast适用于Select但不适用于Where子句

时间:2016-02-09 11:28:29

标签: sql-server where

我有一个奇怪的是我在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变量的其他条件进行调用。

4 个答案:

答案 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)
)

你正在进行大量的多余投射。