GVi*_*i82 9 sql sql-server datetime casting sql-server-2008-r2
我总是在datetime中使用此代码进行转换:
DECLARE @a datetime
SET @a= CONVERT(datetime,'2012-12-28 14:04:43')
print @a
Run Code Online (Sandbox Code Playgroud)
但这不再适用了!我甚至试过重启SQL Server,但问题仍然存在:

图像中的错误是意大利语.英文应该是:
将char数据类型转换为datetime会导致datetime值超出允许值的范围.
mar*_*c_s 16
SQL Server支持许多格式 - 请参阅CDN和CONVERT上的MSDN联机丛书.大多数这些格式取决于您拥有的设置 - 因此,这些设置可能会有效 - 有时不会.
解决此问题的方法是使用SQL Server支持的(略微调整的)ISO-8601日期格式 - 此格式始终有效 - 无论您的SQL Server语言和日期格式设置如何.
在ISO-8601格式由SQL Server支持有两种形式:
YYYYMMDD只为日期(没有时间部分); 请注意:没有破折号!,这非常重要!YYYY-MM-DD是不是独立于你的SQL Server的日期格式设置,将不适用于所有情况!要么:
YYYY-MM-DDTHH:MM:SS对于日期和时间 - 请注意:此格式有破折号(但可以省略),并且T在您的日期和时间部分之间固定为分隔符DATETIME.这适用于SQL Server 2000及更高版本.
如果您使用SQL Server 2008或更新版本以及DATE数据类型(仅限DATE- 不 DATETIME!),那么您确实也可以使用该YYYY-MM-DD格式,并且该格式也适用于SQL Server中的任何设置.
不要问我为什么整个主题如此棘手而且有些混乱 - 这就是它的方式.但是使用这种YYYYMMDD格式,您可以适用于任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置.
所以在你的具体案例中 - 使用这个:
DECLARE @a datetime
SET @a= CONVERT(datetime, '2012-12-28T14:04:43')
print @a
Run Code Online (Sandbox Code Playgroud)
这适用于任何 SQL Server安装,具有任何语言和日期格式设置.
如果您运行美国英语的原始代码 - 它将正常工作:
SET LANGUAGE English
DECLARE @a datetime
SET @a= CONVERT(datetime, '2012-12-28 14:04:43')
print @a
Dec 28 2012 2:04PM
Run Code Online (Sandbox Code Playgroud)
但如果您使用意大利语(或德国,或英国,或法语)为您的语言,它会失败,因为格式不中T的日期/时间字符串的中间是不是独立于语言的,而不是"安全":
SET LANGUAGE Italian
DECLARE @a datetime
SET @a= CONVERT(datetime, '2012-12-28 14:04:43')
print @a
Run Code Online (Sandbox Code Playgroud)
Msg 242,Level 16,State 3,Line 4
La conversione di un tipo di dati varchar in datetime ha generato un valore non compreso nell'intervallo dei valori consentiti.
| 归档时间: |
|
| 查看次数: |
15666 次 |
| 最近记录: |