Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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 Server:转换varchar数据类型时出错_Sql_Sql Server_Datetime - Fatal编程技术网

SQL Server:转换varchar数据类型时出错

SQL Server:转换varchar数据类型时出错,sql,sql-server,datetime,Sql,Sql Server,Datetime,我正在尝试运行SQL查询,但遇到了一个错误 将varchar数据类型转换为datetime数据类型导致值超出范围 代码: 我已将数据类型转换为 SELECT ClientId, Convert (Date, DatePassed) Lender FROM dbo.tbl_Profile_Mortgage WHERE DatePassed = '2011-04-28 00:00:00.000' 然而,这仍然给了我同样的错误 列DatePassed的类

我正在尝试运行SQL查询,但遇到了一个错误

将varchar数据类型转换为datetime数据类型导致值超出范围

代码:

我已将数据类型转换为

SELECT 
    ClientId,
    Convert (Date, DatePassed)
    Lender
FROM 
    dbo.tbl_Profile_Mortgage
WHERE 
    DatePassed = '2011-04-28 00:00:00.000'
然而,这仍然给了我同样的错误

DatePassed
的类型为
datetime null


任何建议都将不胜感激

从概念上讲,您认为
where
子句是在
convert()之前执行的。但这不一定就是查询的运行方式。唯一保证执行顺序的SQL语句是
case
(但并非始终如此)

您可以尝试以下方法:

SELECT ClientId,
       (case when isdate(DatePassed) = 1 then Convert (Date, DatePassed) end),
       Lender
FROM dbo.tbl_Profile_Mortgage
WHERE DatePassed = '2011-04-28 00:00:00.000';
编辑:

如果
DatePassed
已经是日期时间格式,那么您的错误是非常不寻常的。此列的转换没有问题,因为不涉及
varchar

我唯一能想到的就是常数。也许您有一个奇怪的默认日期设置,它试图获得28个月的第4天。如果是这样,您可以通过使用以下格式进行显式转换来轻松解决此问题:

SELECT ClientId,
       Convert(Date, DatePassed),
       Lender
FROM dbo.tbl_Profile_Mortgage
WHERE DatePassed = convert(date, '2011-04-28 00:00:00.000', 121);

Aaron Bertrand在他的文章中对这个问题进行了相当广泛的讨论。顺便说一下,尽管我认识到他提到的YYYY-MM-DD格式的问题,但默认情况下我仍然使用它。我认为这是一个错误,微软选择不承认这个ISO标准格式(但只是因为我认为这是一个bug不一定说服其他人)。< /P> < P>有许多格式支持SQL Server -请参阅。大多数格式取决于您的设置,因此,这些设置有时可能有效,有时无效。我猜在您的例子中,您使用的语言设置与您使用的字符串文字不兼容

解决此问题的方法是使用SQL Server支持的(稍作调整的)ISO-8601日期格式,无论您的SQL Server语言和日期格式设置如何,此格式始终有效

SQL Server支持的有两种风格:

  • YYYYMMDD
    仅适用于日期(无时间段);注意:无破折号,这非常重要
    YYYY-MM-DD
    独立于SQL Server中的日期格式设置,在所有情况下都将工作
或:

  • 日期和时间的
    YYYY-MM-DDTHH:MM:SS
    -此处注意:此格式有破折号(但可以省略),并且在
    DATETIME
    的日期和时间部分之间有一个固定的
    T
    分隔符
这对SQL Server 2000及更新版本有效

如果您使用SQL Server 2008或更高版本以及
日期
数据类型(仅
日期
-
日期时间
!),那么您确实也可以使用
YYYY-MM-DD
格式,这也适用于SQL Server中的任何设置

不要问我为什么这个话题如此棘手,有些令人困惑——事实就是这样。但是使用
YYYYMMDD
格式,您应该可以使用任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置

对于SQL Server 2008及更新版本,如果只需要日期部分,建议使用
DATE
;如果同时需要日期和时间,建议使用
DATETIME2(n)
。如果可能的话,您应该尝试逐步淘汰
DATETIME
数据类型

在具体情况下-在
WHERE
子句中使用此字符串:

WHERE DatePassed = '2011-04-28T00:00:00.000';

(注意日期和时间部分之间的文字
T

它可能会对毫秒产生问题。另外,在查询中执行
date=
不是很有效。通常你会想做一个范围,比如在午夜和午夜之间。嘿,帕库戈麦斯,我试过在'2011-04-28 00:00:00.000'和'2011-04-28 23:59:59.000'之间传递的WHERE date。我仍然会收到错误。毫秒呢?如果你只是在'2011-04-28'和'2011-04-29'之间执行
,会发生什么情况?默认情况下,这将为您提供24小时的范围。您还可能在使用
yyyy-mm-dd
时遇到问题。改为尝试
mm dd yyyy
。Paqogomez当我执行BEVER语句时,我收到了与以前相同的错误。我已经尝试了dd-mm-yyyy,它似乎可以工作,但是不会带回任何数据,也会不惜一切代价避免隐式转换。这可能无法解决您的问题,但将
DatePassed='2011-04-28 00:00:00.000'
更改为
DatePassed=CAST('2011-04-28 00:00:00.000'为DATETIME')
是一种很好的做法。嘿,Gordon,这仍然会给我一个错误
将varchar数据类型转换为DATETIME数据类型导致值超出范围。
WHERE DatePassed = '2011-04-28T00:00:00.000';