SQL 查询在 SQLServer 中插入日期时间

我希望使用下面的 SQL 查询将 datetime值插入到表(SQLServer)中

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

但是我得到了这个错误消息:

“10”附近的语法不正确。

我试过引用他们的话

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

我收到这个错误消息

无法将 varchar 转换为 datetime

1287599 次浏览

您将希望在 SQLServer 中使用 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));

这里是意大利红枣的风格。不仅仅是意大利人,这也是 在线图书中的文化。

对于字符串文字,一个更独立于语言的选择是国际标准 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

根据 TechNet 中的 字符串文字日期和时间格式部分,标准的 ANSI 标准 SQL 数据格式“ YYYY-MM-DD hh: mm: ss”应该是“多语言”的。但是,使用相同的查询,ANSI 格式并不适用于所有 SQL 语言。

例如,在丹麦语中,您会出现以下许多错误:

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

如果您想在 C # 中构建一个查询,以便在 SQLServer 上运行,并且需要传递 ISO 8601格式的日期,请使用 可排序的“ s”格式说明符:

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

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

下面是 C # 中的一个例子

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

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

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

你需要加上

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

管理工作室创建的脚本如下:

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

不需要使用转换。只需将其列为 ISO8601格式的引用日期即可。
像这样:

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

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

我遇到了一个更常见的问题: 获取不同的(不一定已知的)日期时间格式并将它们插入到日期时间列中。我已经用这个语句解决了这个问题,它最终变成了一个标量函数(可以扩展到 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)))

如果日期的格式在 sql 中如下: (datetime,null)

1

您还可以使用“ CAST”关键字

(CAST('2015-12-25 15:32:06.427' AS DateTime))

只要确保日期的格式正确即可