SQL查询在SQL Server中插入datetime

问题描述 投票:110回答:7

我想使用下面的SQL查询将datetime值插入表(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

请帮忙!谢谢。

sql sql-server-2008 datetime
7个回答
200
投票

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

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这里是意大利约会的风格。好吧,不仅仅是意大利人,而是Books Online所归属的文化。


26
投票

对于字符串文字,更加独立于语言的选择是国际标准ISO 8601格式“YYYY-MM-DDThh:mm:ss”。我使用下面的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-18T10: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

根据Microsoft TechNet中的String Literal Date and Time Formats部分,标准ANSI标准SQL日期格式“YYYY-MM-DD hh:mm:ss”应该是“多语言”。但是,使用相同的查询,ANSI格式不适用于所有SQL语言。

例如,在丹麦语中,您会遇到如下错误:

语言错误丹麦语将varchar数据类型转换为日期时间数据类型会导致超出范围的值。

如果要在C#中构建查询以在SQL Server上运行,并且需要传递ISO 8601格式的日期,请使用Sortable "s" format specifier

string.Format("select convert(datetime2, '{0:s}'", DateTime.Now);

15
投票

Management studio创建脚本,如:

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

7
投票

你需要添加它

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

2
投票

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

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

分隔符需要是/,它需要被单个'引号包围。


1
投票

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

这是C#中的一个例子

要存储日期,您必须先将其转换然后存储

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

FooDate是日期时间变量,包含您格式的日期。


1
投票

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

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))) 
热门问题
推荐问题
最新问题