同一SQL在一台机器上工作,但在另一台机器上出现超出范围的错误
同一SQL在一台机器上工作,但在另一台机器上出现超出范围的错误,sql,Sql,将char数据类型转换为datetime数据类型导致datetime值超出范围。 当我在桌面计算机上运行SQL查询时,一切正常。没有错误或任何东西。但是,当我在运行它的服务器上执行相同的代码时,它失败了 我已经确定这是导致问题的SQL部分。DateOfRun是一个DateTime字段 ,(SELECT intField FROM tableA WHERE RowIdentifier= ParentTable.RowIdentifier AND DateO
将char数据类型转换为datetime数据类型导致datetime值超出范围。
当我在桌面计算机上运行SQL查询时,一切正常。没有错误或任何东西。但是,当我在运行它的服务器上执行相同的代码时,它失败了
我已经确定这是导致问题的SQL部分。DateOfRun是一个DateTime字段
,(SELECT intField
FROM tableA
WHERE RowIdentifier= ParentTable.RowIdentifier
AND DateOfRun = Convert(Varchar(10),ParentTable.OfferOutcomeDateTime,120)) AS Days
为什么这在一台机器上有效,而在另一台机器上无效?我的猜测是,由于本地和服务器环境中的文化差异,字符串的日期时间转换会失败。您没有提到您的SQL风格,但最可能的原因是char字段的输入格式与系统的区域设置之间存在差异 “2011年3月30日”在美国是3月30日,但在英国毫无意义。
在英国,“2011年3月30日”是3月30日,但在美国没有意义。如果不同机器上的数据不同,这将在一台机器上工作,而不是在另一台机器上工作 如果您的区域设置不同,它也不起作用 你应该这样做
SET DATEFORMAT dmy
设置要使用的格式
在将日期转换为varchar之前,您还可以将日期转换为本地设置-,这显然很奇怪,可能与区域设置有关,但这就像一个老笑话 一个男人去医生的办公室。他 说,“医生,当我抬起头的时候会疼 我的手臂举过头顶 回答:“那就不要举起你的手臂 在你头上。” 所以不要那样做。改为这样做
WHERE RowIdentifier= ParentTable.RowIdentifier
AND DateOfRun =
DATEADD(DAY, DATEDIFF(DAY, 0, ParentTable.OfferOutcomeDateTime), 0)
这是去看托马斯回答问题的最好办法
然后不管区域设置如何,它都会工作,因为它永远不会被表示为字符串为什么要将
DateTime
字段转换为varchar
,然后将其与另一个DateTime
进行比较?因为DateOfRun没有时间,而OfferCome有时间。00:00:00 14:23:22我猜他是在试图切断时间成分,这两种成分都不应该起作用。正如Adam所提到的那样,SQL毫无意义(将DateTime
转换为Varchar(10)
,然后与DateTime
进行比较)-此外,在WHERE
子句中使用作为天数也不是有效的SQL AFAIK。转换为Varchar是错误的。使用日期数学,如DateDiff和DateAdd。或者转换为没有时间的数据类型。或者告诉我们您的数据库管理系统,以便我们可以为您提供详细信息。实际上,你甚至不应该转换,你应该使用一个范围表达式来代替。转换为varchar是不好的。而是使用日期数学。