163

I want to insert a datetime value into a table(SQL Server) using the sql query below

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

But I get this Error msg. Incorrect syntax near '10'.

I tried it with the quotes

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

I get this error message Cannot convert varchar to datetime

Kindly help! Thanks.

4

7 回答 7

275

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

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

如果您与dd-mm-yy hh:mm:ss xm格式结婚,则需要使用具有特定样式的 CONVERT。

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

5这是意大利日期的风格。嗯,不仅仅是意大利人,这就是它在Books Online中所体现的文化。

于 2012-10-18T14:59:45.827 回答
34

字符串文字的一个更加独立于语言的选择是国际标准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 中的字符串文字日期和时间格式部分,标准 ANSI 标准 SQL 日期格式“YYYY-MM-DD hh:mm:ss”应该是“多语言”。但是,使用相同的查询,ANSI 格式并不适用于所有 SQL 语言。

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

丹麦语语言错误 将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

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

string.Format("select convert(datetime2, '{0:s}'", DateTime.Now);
于 2012-10-18T15:02:47.317 回答
24

Management Studio 创建如下脚本:

insert table1 (foodate) values(CAST(N'2012-06-18 10:34:09.000' AS DateTime))
于 2015-06-10T16:57:01.840 回答
11

你需要像这样添加它

insert into table1(date1) values('12-mar-2013');
于 2013-10-24T06:12:58.087 回答
3

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

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

分隔符必须是 a/并且需要用单'引号括起来。

于 2016-02-28T17:45:52.243 回答
2

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

这是 C# 中的示例

要存储日期,您必须先转换它,然后再存储它

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

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

于 2013-09-28T09:02:13.943 回答
1

我遇到了一个更普遍的问题:获取不同的(不一定是已知的)日期时间格式并将它们插入到日期时间列中。我已经使用这个语句解决了它,它最终变成了一个标量函数(与 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))) 
于 2017-11-12T14:21:02.290 回答