我使用French_CI_AS排序规则在法语中安装了Server。由于遗留的原因,表列将数据存储为VARCHAR,该数据后来转换为正确的类型,类似于C++中的变量。
该列中的两行数据如下:
2020-10-12 22:54:40
2020-10-13 04:42:10第二个日期在转换为带有默认选项的DATETIME时失败。应用程序使用ODBC转义序列。SQL (如COLMVALUE >= {ts'2020-01-01 00:00:00'} )出现错误时失败:
D‘’un type de données nvarchar en type de données datetime a créune valeur
我做了一个DBCC useroptions,服务器将日期格式设置为dmy。为什么第二排失败了?它看起来像是在试图将"13“解释为月份。如果格式是dmy,那么这两个日期不是都失败了吗?
另外,值得注意的是,在此服务器上,以下内容失败:
DECLARE @datevar DATETIME = '2020-10-13 04:42:10';
SELECT @datevar; 但这样做是可行的:
DECLARE @datevar DATETIME2 = '2020-10-13 04:42:10';
SELECT @datevar; 我知道DATETIME2比DATETIME更精确,范围更广。然而,在这里,即使是解析也是不同的。
发布于 2020-10-14 19:28:04
这不是校对问题。这是语言/地区/文化问题。您的DB (或登录的默认语言)被设置为“法语”(很可能),它们使用日期然后月份格式,而不是月份然后日期,因此您的语句试图使用月份13。
试着复制:
SET LANGUAGE French;
DECLARE @datevar DATETIME = '2020-10-13 04:42:10';
/*
Le paramètre de langue est passé à Français.
Msg 242, Level 16, State 3, Line XXXXX
La conversion d'un type de données varchar en type de données datetime a
créé une valeur hors limites.
*/
GO
PRINT '-----';
GO
SET LANGUAGE English;
DECLARE @datevar DATETIME = '2020-10-13 04:42:10';
GO您可以有两个选项来更改这个选项:
关于你的其他问题:
如果格式是
dmy,那么这两个日期不是都失败了吗?
和
(隐含)为什么
DATETIME和DATETIME2对同一日期的解析方式不同?
所有这些都是因为处理约会真的很麻烦。DATEFORMAT的文档不仅声明:
日期时间和小时间解释可能不匹配日期、datetime2或日期时间偏移量。
但也包括:
一些字符串格式(例如ISO 8601 )是独立于DATEFORMAT设置来解释的。
虽然文档没有将这两个语句联系在一起,但是测试确实表明,ISO 8601格式的日期(例如YYYY DD)“独立于DATEFORMAT设置解释”,仅用于DATE**、** DATETIME2**和** DATETIMEOFFSET**。这就是为什么** '2020-10-13'的日期尊重DATETIME变量的DATEFORMAT值的原因(因此,无论将日期分隔为"-“还是"/"),对于月份前一天的区域性,都会收到一个错误,但对于DATETIME2测试而言,将被正确地解析(并且始终不会考虑当前的文化或DATEFORMAT**).**的值。
P.S.我不认为变体/ SQL_VARIANT / object**等是“正确”类型;-)**
https://dba.stackexchange.com/questions/278080
复制相似问题