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


164

我正在尝试如下创建表,

create table table1(date1 datetime,date2 datetime);

首先,我尝试如下插入值,

insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');

它给出了错误的说法,

无法将varchar转换为datetime

然后,我尝试使用以下格式作为我们stackoverflow建议的帖子之一,

insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
                          ,convert(datetime,'01-01-2001 12:00:00 AM',5));

但是仍然出现错误,

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

有什么建议?


2
如您所说,@ Damien_The_Unbeliever 在问这个问题之前,我已经提到了这篇文章stackoverflow.com/questions/12957635/…。他们要求我们使用“插入table1(approvaldate)值(convert(datetime,'18 -06-12 10:34:09 PM',5));'” 但它不起作用
2013年

Answers:


163

SQL Server支持多种格式-请参阅CAST和CONVERT上MSDN联机丛书。这些格式中的大多数取决于您拥有的设置-因此,这些设置有时可能会起作用-有时不起作用。

解决此问题的方法是使用SQL Server支持的(略微修改)ISO-8601日期格式 -这种格式始终有效 -不管您使用的SQL Server语言和dateformat设置如何。

ISO-8601格式由SQL Server支持有两种形式:

  • YYYYMMDD只是日期(无时间部分);注意:没有破折号!,那非常重要!YYYY-MM-DD不是独立于你的SQL Server的日期格式设置,将适用于所有情况!

要么:

  • YYYY-MM-DDTHH:MM:SS日期和时间-请在此处注意:此格式带有破折号(但可以省略),并T在的日期和时间部分之间固定为定界符DATETIME

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

因此,在您的具体情况下-使用以下字符串:

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

并且应该没问题(请注意:为此,您需要使用国际24小时制,而不是12小时AM / PM格式)。

或者:如果您使用的是SQL Server 2008或更高版本,则还可以使用DATETIME2数据类型(而不是plain DATETIME),并且当前数据类型INSERT将正常工作而不会出现任何问题!:-) DATETIME2更好,对转换的挑剔也少得多-无论如何,它还是SQL Server 2008或更高版本的推荐日期/时间数据类型。

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中的任何语言和日期格式设置,都应该可以使用。


1
请注意,强制转换为DATETIME2还可与'YYYY-MM-DDTHH:MM:SSZ'(请注意'Z'-末尾的Zulu时间表示UTC时间戳)一起使用。尝试在日期时间字段中插入“ 2013-12-16T17:21:26Z”时遇到此错误。为了澄清起见,部分支持ISO 8601。尽管在文档中有提及,但它不支持Zulu时间。这可能是我没有时间弄清楚的一些设置,但是如果有人遇到相同的问题,请记住这一点。
米哈尔

3
我可以确认“ YYYYMMDD”日期格式可以正常工作,并在SQL Server 2014上进行了尝试,以作为在WHERE子句中指定文字日期的一种方式。@marc_s的许多战车
Giorgio Barchiesi

1
DATETIME2对我有用。就我而言,我是从英语的SQLServer导入数据库脚本到其西班牙语版本的,因此每次都出现相同的错误。我只是在脚本中将所有“ as DATETIME”事件替换为“ as DATETIME2”,并解决了问题。
亚历杭德罗·德尔里奥

24

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

例:

Create Table MyTable (MyDate);

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

SQL Server将引发以下错误:

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

发生此错误的原因是,年份(2015)中没有这样的日期(Feb-29)。


2
“发生此错误的原因就是,在Year(2015)中没有这样的日期(Feb-29)”, 这正是我收到此错误的原因。该答案考虑了此错误的最常见原因,而其他答案则没有。
FirstFraktal

1
我从Excel表格导入了数据,该表格中的空值实际上在单元格中具有“ NULL”。在数据库表中将其设置为字符串“ Null”,因此尝试将字符串“ Null”转换为日期时间。应该已经清空了Excel中的“ NULL”单元格。我是个白痴:/
karol

17

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

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

可以正常工作,但是

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

将给出错误。

同样

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

将给出错误,其中

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

将工作。


8

只需像下面这样更新日期格式

yyyy-MM-dd hh:MM:ss

它为我解决了问题,并且效果很好


2
请阅读已经提供的其他答案。仅因为您的会话DATEFORMAT设置,此格式才对您有效。通过运行进行验证SET DATEFORMAT MDY;SELECT CAST('2017-08-07 00:00:00' AS datetime); SET DATEFORMAT DMY;SELECT CAST('2017-08-07 00:00:00' AS datetime);。如果添加T分隔符(yyyy-MM-ddTHH:mm:ss),它将可靠地工作。
丹·古兹曼

1
非常感谢,是的,它可以解决我的问题,我在这里阅读了其他答案
Pronab Roy

8

只要有可能,就应该避免使用文化特定的日期/时间文字

有一些安全格式可以提供日期/时间作为原义字词:

的所有示例 2016-09-15 17:30:00

ODBC(我的最爱,因为它会立即作为类型处理)

  • {ts'2016-09-15 17:30:00'} -时间戳
  • {d'2016-09-15'} -仅日期
  • {t'17:30:00'} -仅时间

ISO8601(最适合任何地方

  • '2016-09-15T17:30:00'-注意T中间!

孤注一掷(被误解为数字的微小风险)

  • '20160915' -仅适用于日期

谨记:无效的日期往往会出现奇怪的错误

  • 没有6月31日或2月30日...

奇怪的转换错误的另一个原因:执行顺序!

众所周知,SQL Server按照执行顺序执行某人可能没有想到的事情。您的书面陈述看起来像在完成与类型相关的操作之前完成转换,但是引擎决定(为什么这样做)在以后的步骤中进行转换。

这是一篇很棒的文章,并通过示例进行了解释:Rusano.com:“t-sql-functions-do-no-imply-确定执行顺序”,这是相关的问题


3

最好的方法是这段代码

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"

2
convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127')))  as fecha,

1
如果您使用反引号而不是初始空格,则会出现换行现象。
Z的Jesse W-2002年

2

在SQL Server上实际运行的datetime格式是

yyyy-mm-dd hh:MM:ss

1
不,这是不正确的(m和和不匹配 M)。阅读Dan Guzman对Pronab Roy的回答的评论。并在这里阅读其他答案...
Shnugo

2

请尝试这个。

SQL Server期望使用MM / DD / YYYY格式的日期,如果将英语设置为默认语言。此处将datepicker值保存到sql2008数据库中。我的字段类型是database中的datetime。dpdob是我的datepicker名称。

           Dim test = dpdob.Text.Replace("-", "/")
           Dim parts As String() = test.Split(New Char() {"/"c})
           Dim firstPart As String = parts(0)
           Dim thirdPart As String = parts(2)
           Dim secondPart As String = parts(1)
           Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
           Dim dob = test1

现在在插入查询中使用dob。


1

您可以尝试此代码

select (Convert(Date, '2018-04-01'))

1

尝试连接时遇到了这个问题 getdate()到要插入nvarchar字段的字符串。

我做了一些铸造来解决它:

 INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES 
   (
    'EMAIL_HEADER',
    '<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' + 
        CAST(CAST(getdate() AS datetime2) AS nvarchar) + 
    '<br /><br /><br />'
   )

那是一个很好的例子。关键部分是:

...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...

将日期强制转换为datetime2,然后将nvarchar其连接。



0

从web.config文件将Culture设置为英语

  <globalization uiCulture="en-US" culture="en-US" />

例如,如果您将文化设置为阿拉伯语,thime将是

22/09/2017 02:16:57图片

并且您收到错误:在插入datetime时从字符串转换日期和/或时间时转换失败



0

对我来说,这工作:

INSERT INTO [MyTable]
           ([ValidFrom]
           ,[ValidTo])
       VALUES
           ('2020-01-27 14:54:11.000'
           ,'2023-01-27 14:52:50.000')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.