SQL查询插入date时间在SQL Server中

我想插入一个datetime值到一个表(SQL Server)使用下面的SQL查询

 insert into table1(approvaldate)values(18-06-12 10:34:09 AM); 

但是我得到这个错误味精。 Incorrect syntax near '10'.

我用报价试了一下

 insert into table1(approvaldate)values('18-06-12 10:34:09 AM'); 

我收到此错误消息Cannot convert varchar to datetime

请帮助! 谢谢。

您将希望使用YYYYMMDD在SQL Server中进行明确的date确定。

 insert into table1(approvaldate)values('20120618 10:34:09 AM'); 

如果你已经嫁给了dd-mm-yy hh:mm:ss xm格式,那么你将需要使用具有特定风格的CONVERT。

 insert table1 (approvaldate) values (convert(datetime,'18-06-12 10:34:09 PM',5)); 

5这里是意大利date的风格。 那么,不只是意大利人,但这是它在图书在线的文化。

请参阅Microsoft TechNet中的string文字date和时间格式部分。

您可以使用标准的ANSI标准SQLdate格式。 根据上面的链接,它被标记为“多语言”:

 insert into table1(approvaldate) values ('2012-06-18 10:34:09') 

但是,这不适用于所有语言。 例如,下面是一个快速脚本,它使用dynamicSQL来testingsys.syslanguages中定义的所有SQL语言中的date格式:

 declare @sql nvarchar(4000) declare @LangID smallint declare @Alias sysname declare @MaxLangID smallint select @MaxLangID = max(langid) from sys.syslanguages set @LangID = 0 while @LangID <= @MaxLangID begin select @Alias = alias from sys.syslanguages where langid = @LangID if @Alias is not null begin begin try set @sql = N'declare @TestLang table (langdate datetime) set language ''' + @alias + N'''; insert into @TestLang (langdate) values (''2012-06-18 10:34:09'')' print 'Testing ' + @Alias exec sp_executesql @sql end try begin catch print 'Error in language ' + @Alias print ERROR_MESSAGE() end catch end select @LangID = min(langid) from sys.syslanguages where langid > @LangID end 

如果你运行这个脚本,你会发现很多错误,如下所示:

语言中的错误丹麦语将varchar数据types转换为date时间数据types导致超出范围的值。

国际标准ISO 8601格式是string文字更独立于语言的select。 除了date和时间之间的“T”字面外,这种格式与ANSI标准非常相似:

 insert into @TestLang (langdate) values ('2012-06-18T10:34:09') 

我testing了这一点,它确实在所有的SQL语言中工作。

pipe理工作室创build如下脚本:

 insert table1 (foodate) values(CAST(N'2012-06-18 10:34:09.000' AS DateTime)) 

你需要像添加它

 insert into table1(date1) values('12-mar-2013'); 

如果您通过任何编程语言存储值

这里是一个在C#中的例子

要存储date,您必须先将其转换并存储

 insert table1 (foodate) values (FooDate.ToString("MM/dd/yyyy")); 

FooDate是date时间variables,其中包含您的格式的date。

不需要使用转换。 只需将其列为ISO 8601格式的引用date即可。
像这样:

 select * from table1 where somedate between '2000/01/01' and '2099/12/31' 

分隔符需要是/并且需要被单个引号包围。

我遇到了一个更通用的问题:获取不同的(不一定是已知的)date时间格式,并将它们插入到date时间列中。 我已经使用这个语句解决了这个问题,最终成为一个标量函数(与ODBC规范,美国,ANSI和英国\法国date样式相关 – 可以扩展):

 insert into <tableName>(<dateTime column>) values(coalesce (TRY_CONVERT(datetime, <DateString, 121), TRY_CONVERT(datetime, <DateString>, 101), TRY_CONVERT(datetime, <DateString>, 102), TRY_CONVERT(datetime, <DateString>, 103)))