说,我有一张这样的表:
表名" DateTimeFormatCheck" >
我使用下面的查询来插入:
Insert into [dbo].[DateTimeFormatCheck] ([DateTimeCheck]) values('11/19/2014 1:29 PM')
它插入了日期,如 2014-11-19 13:29:00.000 ,但我的插入格式( M / d / yyyy h:m tt )不一样作为插入日期。
现在我想知道 SQL Server如何检测我提供的字符串日期格式?和为什么它始终提供此格式yyyy-MM-dd HH:mm:插入后的ss吗
由于
答案 0 :(得分:11)
不要那样做!不要使用字符串而不是日期,也不要使用特定于文化的日期或日期时间格式,这是灾难的一种方法。
SQL Server没有“日期格式”,只是用于将日期转换为字符串和从字符串转换日期的格式。其中一个是默认值,由服务器的排序规则控制。您既不能假设也不应该依赖于特定的排序规则,因此您应该尽可能避免转换。此外,传递字符串值可能会阻止SQL Server在日期列上使用索引,因为它必须将字符串转换为基础列类型。
将日期作为日期类型的变量或参数传递会更容易,更安全。您可以通过这种方式避免整个转换混乱,来回避免SQL注入攻击。
没有理由将字符串而不是日期传递给服务器。所有SQL Server客户端(包括ADO.NET)都允许您执行参数化查询。像NHibernate和Entity Framework这样的ORM也为日期类型的列生成参数化查询。
每当您需要创建字符串文字时,请使用其中一种不变格式,例如20140913
或2012-11-07T18:26:20
答案 1 :(得分:1)
sqlserver的格式为yyyy-mm-dd,但您可以通过执行命令来定义输入
设置dateformat dmy - 接受dmy格式
set dateformat mdy
select cast( '11-9-2014' as date)
set dateformat dmy
select cast( '11-9-2014' as date)
<强>更新强>
理想情况下,您无法尝试更改格式,您可以验证数据然后插入。
每当我们插入到datetime数据类型时,sqlserver将隐式尝试转换为mmddyyy hhmmss格式。因此,如果您将日期定为2014年11月19日,则将其转换为2014年11月19日,即2014年11月19日。
但如果你在中间部分给出超过12,它将不会隐式转换并抛出转换错误。
除了mmddyyyy格式之外,您必须使用显式转换或转换函数以允许数据插入或更新。
在转换之前,你可以在sqlserver中使用ISDATE或TRY_PRASE或PARSE函数,检查转换是否成功。
您可以创建一个函数或只添加一行
declare @dt varchar(50) = '19-11-2014 10:10:41'
declare @dTable table ( datecolumn datetime)
INSERT into @dTable values (
case
when isdate(CONVERT( varchar(50), @dt)) = 1 then CONVERT( varchar(50), @dt) --'19-11-2014 10:10:41'
when isdate(CONVERT( varchar(50), @dt, 103) ) = 1 then CONVERT( datetime, @dt , 103 ) --'19-11-2014 10:10:41'
when isdate(CONVERT( varchar(50), @dt, 102) ) = 1 then CONVERT( datetime, @dt , 102 ) --'19-11-2014 10:10:41'
--when --give other format as above given and if not set in any dateformat , then simply return null
else
null
end )
select * from @dTable