在插入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转换失败