Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
同一SQL在一台机器上工作,但在另一台机器上出现超出范围的错误_Sql - Fatal编程技术网

同一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是不好的。而是使用日期数学。