我在我们的SQL Server 2014 Standard Edition(64位)上观察到一种奇怪的行为,我无法解释:
简单的select语句在手动执行或通过SQL Job执行时的行为有所不同:
sql语句如下:
[USE DB2]
GO
Select * from DB1.dbo.price p
where
p.sec_id = 10 and
p.dt = CONVERT(date,getdate() - (case when datename(dw,getdate()) = 'Monday' then 3 else 1 end))
该语句从表dbo.price中取出某个证券(通常为1天)的前一个工作日的价格记录(sec_id = 10),但是星期一为3天,因为只有价格记录可用的工作日(每个证券每个工作日1条价格记录)。
此sql语句嵌入到存储过程中,该存储过程本身是通过SQL Server代理作业执行的。
奇怪的是:
由于该工作在星期二至星期五工作,因此不应该有特权等问题。并且由于该语句在手动执行时是有效的,因此该语句本身也不应该有任何问题。
但是为什么通过SQL作业执行时,它在星期一不起作用?
有人会知道原因可能是什么吗?不幸的是我没有...
非常感谢您的帮助。 干杯
答案 0 :(得分:2)
这是由于代理作业运行所使用的身份的默认语言。
在您的代理工作中,将其添加到脚本中:
android:clickable="true"
android:focusable="true"
[或您希望将其视为一周的第一天]
(它是特定于连接的,因此不会影响其他连接。)
或者您可以更改SQL代理(或代理(如果使用的是代理))使用的登录名的默认语言:
SET DATEFIRST 7
答案 1 :(得分:2)
与Mitch says一样,很可能是由于代理作业使用的语言/日期设置不同。
我首选的解决方法不是摆弄设置,而是选择具有正确属性的“已知好”日子:
datename(dw,getdate()) = datename(dw,'20150720')
碰巧,2015年7月20日(选择完全是任意的,我只是碰巧有一个2015年的台历)在星期一,而我使用的是明确的日期格式。因此,无论何时 datename(dw,getdate())
星期一都应该返回datename(dw,'20150720')
产生的东西。