SQL Server过滤器仅适用于周末的变量

时间:2015-06-24 08:45:02

标签: sql sql-server

我有一个字符串的变量,我可以使用它来过滤一周中的某些天,或整个周末使用

where datepart(dw,date) in (@weekday)

我将@weekday声明为nvarchar

当我@weekday = '1'或任何一天它完美无缺时,但当我尝试@weekday = '1,7'时,它无法将数据类型转换为int

任何想法如何解决这个问题?

5 个答案:

答案 0 :(得分:0)

您正在尝试使用@weekday,就好像您有一个动态SQL,这样您的where子句将是:

where datepart(dw, date) in (1, 7)

然而,实际发生的是:

where datepart(dw, date) in ('1, 7')

这是为了将datepart(dw, date)'1, 7'进行比较,这显然注定要失败,因为一个是INT而另一个是NVARCHAR

尝试使用动态SQL或找到问题的另一种解决方案。

例如,您可以尝试类似的方法(可能无法解决方案,但需要对其进行调查:

where (@weekday = '1, 7' AND datepart(dw,date) in (1, 7)) OR
      (@weekday != '1, 7' AND datepart(dw,date) = @weekday)

这会查看@weekday是否设置为'1, 7',如果是,则手动检查1和7中的datepart,或者如果没有执行正常工作日的原始检查。

答案 1 :(得分:0)

你不能这样用。您只有以下选项:

  1. 在动态SQL语句中运行整个脚本,这很糟糕。
  2. 将您的位置改为:where datepart(dw,date) = @weekday1 OR datepart(dw,date) = @weekday2
  3. 将您的nvarchar变量更改为表变量,将1和7插入其中,并在查询中的JOIN中使用它来过滤行。

答案 2 :(得分:0)

你可以写成:

DECLARE @xml as xml,@weekday as nvarchar(100),@delimiter as varchar(10)
SET @weekday='1,7'
SET @delimiter =','
SET @xml = cast(('<X>'+replace(@weekday,@delimiter ,'</X><X>')+'</X>') as xml)

(...)
where datepart(dw,date) in (
SELECT N.value('.', 'int') as value FROM @xml.nodes('X') as T(N)
)

答案 3 :(得分:0)

您可以尝试这样:

声明@weekday表(wday int) 插入@weekday(wday)值(1) 插入@weekday(wday)值(7)

其中DATEPART(dw,f_ArriveDate)in(select * from @weekday)

答案 4 :(得分:0)

IN只能与子选择或值列表一起使用。您的@weekday是1值,不会被视为超过1个值。将无数值与数字进行比较时,将出现错误。解决这个问题的最佳方法是将@weekday重写为表格。这是一个如何做到的例子:

考虑1是星期一,2星期二... 7星期日。此脚本将找到正确的匹配日

DECLARE  @weekday varchar(30)= '1,7'

DECLARE @t table(date date)
INSERT @t values
  ('2015-06-22'),('2015-06-23'),('2015-06-24'),('2015-06-25'),
  ('2015-06-26'),('2015-06-27'),('2015-06-28')

;WITH CTE as
(
  SELECT x - 1 x FROM 
    (values('1'),('2'),('3'),('4'),('5'),('6'),('7')) x(x)
  WHERE @weekday like '%' + x + '%'

)
SELECT date
FROM @t 
JOIN CTE
ON 
  datediff(d, 0, date)%7 = CTE.x