SQL查询以在SQL Server中插入日期时间


133

我想datetime使用下面的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

请帮助!谢谢。

Answers:


229

您将需要使用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这是意大利约会的风格。好吧,不仅是意大利语,这就是它在Online Books中归因于的文化。


1
谢谢..它有效。顺便说一句,不能以DD-MM-YY格式输入吗?
Shee 2012年

@RichardTheKiwi是什么意思5
Shee

@Shee看到了更多的页脚回答
RichardTheKiwi 2012年

4
我的立场是正确的-如果您使用的是YYYYMMDD HH:MM:SS(以24小时制-世界格式,除了美国以外,任何人都使用此格式,而不仅仅是军事....)没有破折号-它可以工作,甚至适用于British语言。YYYY-MM-DD HH:MM:SS但是,如果使用它,它将失败-在这种情况下(带短划线),您确实需要使用T文字来分隔日期和时间。
marc_s 2012年

1
@Shee看一下SET DATEFORMAT声明。这是单个连接的设置,但是可以在服务器范围内指定该设置。您还可以指定SET LANGUAGE控制诸如将哪个字符用于基数之类的东西,并且日期格式将从该字符继承(同样,在服务器或连接级别)。只是默认值为美国英语,而mdy是美国格式。具有4年日期的ymd始终可以正常工作。
培根片

29

字符串文字的一种与语言无关的选择是国际标准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);

似乎您只能使用YYYYMMDD日期,并且YYYY-MM-DDThh:mm:ss(带破折号,是的,T介于日期和时间之间!)或YYYYMMDD HH:MM:SS(无破折号,没有分隔文字)都可以真正与语言无关...
marc_s 2012年

1
@marc_s:谢谢你的评论。我编辑了答案,以提及ISO 8601格式(如您所提到的,其中包括T文字)。
保罗·威廉姆斯

插入@TestLang(langdate)值('2012-06-18T10:34:09')是最佳答案。
MERTDOĞAN17年


8

您需要像添加它

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

2

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

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

分隔符必须为a,/并且必须用单'引号引起来。


1

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

这是C#中的示例

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

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

FooDate是datetime变量,它包含格式的日期。


1

我遇到了一个更通用的问题:获取不同的(不一定是已知的)日期时间格式并将其插入到日期时间列中。我已经使用以下语句解决了它,该语句最终成为标量函数(与ODBC规范,美国,ANSI和british \ 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))) 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.