2012-10-18 73 views
81

我想用SQL查询中插入一个datetime价值为表(SQL Server)的下方SQL查询来插入日期时间在SQL Server

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

请帮助! 谢谢。

回答

147

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

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

如果你嫁给了dd-mm-yy hh:mm:ss xm格式,您需要使用与特定风格的转换。

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

5这里是意大利日期的风格。那么,不只是意大利人,但这是它在Books Online归因于的文化。

+1

谢谢。它的工作原理。顺便说一句,是不是可以输入DD-MM-YY格式? – Shee

+0

@RichardTheKiwi'5'代表什么? – Shee

+0

@Shee see footer to answer – RichardTheKiwi

18

请参阅Microsoft TechNet中的String Literal Date and Time Formats部分。

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

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

但是,这不适用于所有语言。例如,下面是使用动态SQL在sys.syslanguages定义的所有SQL语言测试日期格式快速脚本:

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数据类型转换为日期时间数据类型导致超出范围的值。

更独立于语言的选择。字符串字面量是国际标准ISO 8601格式。这种格式是非常相似的ANSI标准,除了一个“T”的日期和时间之间的文字:

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

我进行了测试,它确实在所有的SQL语言。

+0

似乎你可以使用'YYYYMMDD'仅用于日期,并且'YYYY-MM-DDThh:mm:ss'(with破折号,是的,在日期和时间部分之间的'T')或'YYYYMMDD HH:MM:SS'(没有破折号,没有分隔字面值)是真正的语言独立... –

+1

@marc_s:谢谢你的评论。我编辑了我的答案,提到了ISO 8601格式(其中包括你提到的T文字)。 –

+1

添加了一个脚本来测试所有语言的日期格式。 –

1

如果你通过任何编程语言

这里存储的值是在C#示例

存储日期,你必须首先转换,然后存储它

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

FooDate为datetime包含你的日期格式的变量。

6

你需要添加像

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

Management Studio中创建的脚本,如:

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

无需使用转换。只需将其列为ISO 8601格式的引用日期即可。
像这样:

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

的分离需要一个/,它需要通过单一'引号引起来。

1

我遇到了一个更一般的问题:获取不同的(不一定是已知的)日期时间格式并将它们插入到datetime列中。我已经使用这个说法,这是最后成了一个标量函数解决了这个问题(相关ODBC规范,美国,ANSI和英国\獐日期样式 - 可扩展):

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)))