首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Server使用无效的样式将VARCHAR转换为日期时间?

为什么Server使用无效的样式将VARCHAR转换为日期时间?
EN

Stack Overflow用户
提问于 2015-04-28 12:34:00
回答 3查看 1.4K关注 0票数 9

我无法从文献资料中看出Server为什么以指定样式以外的格式解析文本。

无论我是否以预期格式提供文本:

代码语言:javascript
复制
SELECT CONVERT(DATETIME, N'20150601', 112)

或不正确的格式(用于样式113):

代码语言:javascript
复制
SELECT CONVERT(DATETIME, N'20150601', 113)

结果是一样的:2015-06-01 00:00:00.000,我希望后者不能转换日期(正确)。

在尝试将VARCHAR转换为DATETIME时,它采用了哪些规则?也就是说,为什么后者(不正确的格式风格)仍然正确地解析日期?

编辑:似乎我还不够清楚。样式113应该期望dd mon yyyy hh:mi:ss:mmm(24h),但出于某种原因,它很高兴地以yyyymmdd格式转换值。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-28 13:01:57

因为日期是标准格式的(20150101)。数据库引擎隐式地落在它上面。这是一个兼容性特性。

如果您将这些格式转换成英国或美国的日期格式,您将收到转换错误,因为它们不能被隐式转换。

编辑:您实际上可以告诉它将其转换为一只猪,并且它仍然会隐式地转换它到目前为止的时间:

代码语言:javascript
复制
select convert(datetime,'20150425',99999999)
select convert(datetime,'20150425',100)
select convert(datetime,'20150425',113)
select convert(datetime,'20150425',010)
select convert(datetime,'20150425',8008135)
select convert(datetime,'20150425',000)

并证明这是一个兼容特性:

代码语言:javascript
复制
select convert(datetime2,'20150425',99999999)

虽然仍然可以隐式转换datetime2对象,但样式必须在转换图的范围内。

票数 6
EN

Stack Overflow用户

发布于 2015-04-28 13:03:42

将日期N'20150601'转换为有效日期时间的原因是,在Server中,文字N'20150601'是日期时间的通用符号。这意味着,如果您以N'yyyymmdd格式声明日期时间值,则Server知道它是通用的日期时间格式,并知道如何读取它。

票数 1
EN

Stack Overflow用户

发布于 2015-04-28 12:37:22

为了应用这些格式,您应该转换为varchar类型:

代码语言:javascript
复制
SELECT CONVERT(varchar(100), CAST('20150601' as date), 113)

好的,您正在将datetime转换为datetime。你还想要什么?为了应用格式,您应该转换为varchar,并且必须将日期或时间类型作为第二个参数。

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

https://stackoverflow.com/questions/29919670

复制
相关文章

相似问题

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