首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有French_CI_AS排序规则数据转换的Server

具有French_CI_AS排序规则数据转换的Server
EN

Database Administration用户
提问于 2020-10-14 18:50:12
回答 1查看 1.7K关注 0票数 4

我使用French_CI_AS排序规则在法语中安装了Server。由于遗留的原因,表列将数据存储为VARCHAR,该数据后来转换为正确的类型,类似于C++中的变量。

该列中的两行数据如下:

代码语言:javascript
复制
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,那么这两个日期不是都失败了吗?

另外,值得注意的是,在此服务器上,以下内容失败:

代码语言:javascript
复制
DECLARE @datevar DATETIME = '2020-10-13 04:42:10';    
SELECT @datevar;  

但这样做是可行的:

代码语言:javascript
复制
DECLARE @datevar DATETIME2 = '2020-10-13 04:42:10';    
SELECT @datevar;  

我知道DATETIME2DATETIME更精确,范围更广。然而,在这里,即使是解析也是不同的。

EN

回答 1

Database Administration用户

发布于 2020-10-14 19:28:04

这不是校对问题。这是语言/地区/文化问题。您的DB (或登录的默认语言)被设置为“法语”(很可能),它们使用日期然后月份格式,而不是月份然后日期,因此您的语句试图使用月份13。

试着复制:

代码语言:javascript
复制
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

您可以有两个选项来更改这个选项:

  1. 集合语言 --它不仅控制日期格式,还控制货币符号、日期和月份名称等。考虑到它控制的不仅仅是日期格式,这可能不是最好的选择,但如果只需要更新登录的默认语言,而不是更新大量代码来执行选项2,则可能会更容易。
  2. 设置数据 -这仅仅控制日期格式:设置语言法语;宣布@datevar日期时间= '2020-10-13 04:42:10';/* Le paramètre de langue est passéàFran ais。Msg 242,第16级,状态3,第XXXXX La转换型de données varchar en type de données datetime a créune valeur hors限值。*/ SET DATEFORMAT;声明@datevar 2 DATETIME = '2020-10-13 04:42:10';选择@datevar作为@datevar,@datevar 2作为@datevar2 2 2;/* @datevar@datevar 2为空2020-10-13 04:42:10.000 */

关于你的其他问题:

如果格式是dmy,那么这两个日期不是都失败了吗?

(隐含)为什么DATETIMEDATETIME2对同一日期的解析方式不同?

所有这些都是因为处理约会真的很麻烦。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**等是“正确”类型;-)**

票数 7
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/278080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档