首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >插入日期时间时,从字符串转换日期和/或时间时转换失败

插入日期时间时,从字符串转换日期和/或时间时转换失败
EN

Stack Overflow用户
提问于 2013-01-02 16:49:59
回答 17查看 1.2M关注 0票数 183

我正在尝试创建一个表,如下所示,

代码语言:javascript
复制
create table table1(date1 datetime,date2 datetime);

首先,我尝试插入如下所示的值,

代码语言:javascript
复制
insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');

它给出的错误是,

无法将varchar转换为datetime

然后我尝试了下面的格式,作为我们的stackoverflow建议的帖子之一。

代码语言:javascript
复制
insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
                          ,convert(datetime,'01-01-2001 12:00:00 AM',5));

但我还是得到了错误的答案:

从字符串转换日期和/或时间时,

转换失败

有什么建议吗?

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2013-01-02 16:51:41

SQL Server支持许多格式-请参阅MSDN Books Online on CAST and CONVERT。这些格式中的大多数都依赖于您的设置的-因此,这些设置有时可能起作用,有时则不起作用。

解决此问题的方法是使用SQL Server支持的(稍作调整的) SQL 8601日期格式-此格式适用于always,而不考虑您的SQL Server语言和日期格式设置。

SQL Server支持的ISO-8601 format有两种风格:

  • YYYYMMDD只表示日期(没有时间部分);这里注意:没有破折号!,这非常重要!YYYY-MM-DD is 独立于SQL Server中的日期格式设置,不会在所有情况下都能工作!

或者:

日期和时间的

  • YYYY-MM-DDTHH:MM:SS -注意:这种格式包含破折号(但可以省略它们),并在DATETIME.

的日期和时间部分之间使用固定的T作为分隔符

这对SQL Server 2000及更高版本有效。

因此,在您的特定情况下,请使用以下字符串:

代码语言:javascript
复制
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

你应该没问题(注意:你需要使用国际的24小时格式,而不是12小时的AM/PM格式)。

Alternatively:如果您使用的是SQL Server 2008 或更高版本,您也可以使用DATETIME2数据类型(而不是普通的DATETIME),并且您当前的INSERT将不会有任何问题!:-) DATETIME2在转换方面要好得多,也不那么挑剔-而且它是SQL Server 2008或更高版本的推荐日期/时间数据类型。

代码语言:javascript
复制
SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

不要问我为什么整个主题如此棘手和令人困惑--这就是它的方式。但是对于YYYYMMDD格式,您应该可以适用于SQL Server的任何版本以及SQL Server中的任何语言和日期格式设置。

票数 189
EN

Stack Overflow用户

发布于 2015-06-07 04:18:34

SQL server中的转换有时会失败,这不是因为使用了日期或时间格式,而仅仅是因为您试图存储系统无法接受的错误数据。

示例:

Create Table MyTable (MyDate);

Insert Into MyTable(MyDate) Values ('2015-02-29');

SQL服务器将抛出以下错误:

Conversion failed when converting date and/or time from character string.

此错误的原因只是因为在年份(2015)中没有这样的日期(2月29日)。

票数 33
EN

Stack Overflow用户

发布于 2013-01-02 17:01:08

答案很简单--5是意大利语"yy“,105是意大利语"yyyy”。因此:

代码语言:javascript
复制
SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

将会正常工作,但是

代码语言:javascript
复制
SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

将会给出错误。

同样的,

代码语言:javascript
复制
SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

将给出错误,其中

代码语言:javascript
复制
SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

都会起作用的。

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

https://stackoverflow.com/questions/14119133

复制
相关文章

相似问题

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