Answers:
您将需要使用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中归因于的文化。
5
?
YYYYMMDD HH:MM:SS
(以24小时制-世界格式,除了美国以外,任何人都使用此格式,而不仅仅是军事....)没有破折号-它可以工作,甚至适用于British
语言。YYYY-MM-DD HH:MM:SS
但是,如果使用它,它将失败-在这种情况下(带短划线),您确实需要使用T
文字来分隔日期和时间。
SET DATEFORMAT
声明。这是单个连接的设置,但是可以在服务器范围内指定该设置。您还可以指定SET LANGUAGE
控制诸如将哪个字符用于基数之类的东西,并且日期格式将从该字符继承(同样,在服务器或连接级别)。只是默认值为美国英语,而mdy是美国格式。具有4年日期的ymd始终可以正常工作。
字符串文字的一种与语言无关的选择是国际标准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
(无破折号,没有分隔文字)都可以真正与语言无关...
Management Studio创建如下脚本:
insert table1 (foodate) values(CAST(N'2012-06-18 10:34:09.000' AS DateTime))
我遇到了一个更通用的问题:获取不同的(不一定是已知的)日期时间格式并将其插入到日期时间列中。我已经使用以下语句解决了它,该语句最终成为标量函数(与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)))