我知道如何解决这个问题,但我不明白为什么当我从SSMS运行下面的查询时它会起作用的技术性,但是当我将它添加为 SQL Server 代理中的作业时,相同的查询会失败。
查询:
select LEFT(datediff(day,GETDATE(),'31/08/20'+'26')/365.25,2) AS test
作业失败时出现的错误:
从字符串转换日期和/或时间时转换失败。[SQLSTATE 22007](错误 241)。步骤失败。
SQL 代理是否使用不同的引擎或不同的技术?
它失败了,因为您没有使用语言中立的日期时间格式。您假设 SQL Server 理解首先是一天,然后是月份,最后是年份。
当您使用 SSMS 以交互方式运行此操作时,您正在使用具有与该顺序相对应的日期格式的登录名(如在 CREATE LOGIN 命令中)。即,您登录的日期格式是 dmy。
很明显,代理使用不同的日期时间格式进行登录。这就是它失败的原因。也许是 mdy(us_english 的默认值)。
您要做的是使用不依赖于登录的日期时间设置的日期时间格式——我喜欢称之为“语言中立”的日期时间格式。YYYYMMDD 就是这样一种格式。这是您转换为该格式的表达式:
另一种选择是在表达式之前添加 SET DATEFORMAT:
这是我写的关于日期时间的文章:https ://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes
我不会乱用特工的语言!你永远不知道什么会破坏。只需使用 dateformat 命令或(最好)使用语言中性的日期时间格式。
我会说问题与查询运行时使用的语言有关。
请从 SSMS 和您创建的作业中运行它,以检查两种方法使用的语言是否相同:
当我从 SSMS 运行时出现相同错误时,您的查询失败,原因是日期格式导致31/08成为无效日期,而08/31工作正常。我的语言目前是
us_english
.如果需要,可以使用SET LANGUAGE命令设置会话的语言。