在插入date时间时,从string转换date和/或时间时转换失败

我试图创build一个表如下,

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

然后,我尝试下面的格式作为我们的stackoverflowbuild议的职位之一,

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

但是我仍然听错了,

从string转换date和/或时间时转换失败

有什么build议么?

SQL Server支持多种格式 – 请参阅CAST和CONVERT上的MSDN联机丛书 。 大多数这些格式都取决于你有什么设置 – 因此,这些设置可能会工作一些 – 有时不。

解决这个问题的方法是使用SQL Server支持的(稍作改动的) ISO-8601date格式 – 无论您的SQL Server语言和date格式设置如何,此格式始终可用。

ISO-8601格式是由SQL Server支持的两种版本:

  • YYYYMMDD只是date(没有时间部分); 注意这里: 没有破折号! ,这非常重要! YYYY-MM-DD 独立于SQL Server中的dateformat设置, 不会在任何情况下工作!

要么:

  • YYYY-MM-DDTHH:MM:SS用于date和时间 – 请注意:此格式具有破折号(但可以省略),以及固定的T作为DATETIME的date和时间部分之间的分隔符。

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

所以在具体的情况下 – 使用这些string:

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

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

或者,如果您使用的是SQL Server 2008或更新版本,那么也可以使用DATETIME2数据types(而不是简单的DATETIME ),而您当前的INSERT只会正常工作! 🙂 DATETIME2比转换更好一些,而且是SQL Server 2008或更新的推荐date/时间数据types。

 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中的任何语言和dateformat设置,都应该可以。

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

例:

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年(2015年)没有这样的date(2月29日)。

简单的回答 – 5是意大利语“YY”,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) 

将工作。

只要有可能, 应避免文化特定的date/时间文字

有一些安全格式:

所有范例2016-09-15 17:30:00

ODBC(我最喜欢的,因为它被立即作为真正的types处理)

  • {ts'2016-09-15 17:30:00'} – 时间戳
  • {d'2016-09-15'} – 仅限date
  • {t'17:30:00'} – 只有时间

ISO8601( 到处都是最好的)

  • 2016-09-15T17:30:00 – 意识到中间的T

不平等(很小的风险被误解为数字)

  • 20160915纯粹的date

无效的date往往会出现奇怪的错误

  • 六月三十一日或二月三十日

还有一个原因:执行顺序!

SQL-Server很清楚按照人们可能没有预料到的执行顺序来做事情。 您的书面声明看起来像某种types的相关操作之前完成了转换,但引擎决定 – 为什么要 – 在稍后的步骤中进行转换。

这里有一篇很好的文章用这个例子解释了这个: Rusano.com:“t-sql-functions-do-no-imply-a–e-order-of-execution”这里是相关的问题 。

最好的办法是这个代码

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

请试试这个。

SQL Server预计date的MM / DD / YYYY格式,如果英语被设置为默认language.Here保存datepicker值到sql2008 database.My字段types是datetime在database.dpdob是我的dateselect器名称。

  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。

 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, 

只需更新date格式就像下面

 yyyy-MM-dd hh:MM:ss 

它解决了我的问题,它工作正常

实际上在sql server上运行的date时间格式是

 yyyy-mm-dd hh:MM:ss 

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

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

例如,如果你把文化设置为阿拉伯语,那么这个文化就会变成阿拉伯文化

22/09/2017 02:16:57ص

并得到错误:插入date时间时转换date和/或时间从string转换失败