我有一个字符串的变量,我可以使用它来过滤一周中的某些天,或整个周末使用
where datepart(dw,date) in (@weekday)
我将@weekday
声明为nvarchar
当我@weekday = '1'
或任何一天它完美无缺时,但当我尝试@weekday = '1,7'
时,它无法将数据类型转换为int
。
任何想法如何解决这个问题?
答案 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)
你不能这样用。您只有以下选项:
where datepart(dw,date) = @weekday1 OR datepart(dw,date) = @weekday2
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