哪些设置提供SQL Server默认日期时间格式?

时间:2014-11-19 07:58:05

标签: sql-server datetime

说,我有一张这样的表:

表名" DateTimeFormatCheck" >

enter image description here

我使用下面的查询来插入:

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吗

由于

2 个答案:

答案 0 :(得分:11)

不要那样做!不要使用字符串而不是日期,也不要使用特定于文化的日期或日期时间格式,这是灾难的一种方法。

SQL Server没有“日期格式”,只是用于将日期转换为字符串和从字符串转换日期的格式。其中一个是默认值,由服务器的排序规则控制。您既不能假设也不应该依赖于特定的排序规则,因此您应该尽可能避免转换。此外,传递字符串值可能会阻止SQL Server在日期列上使用索引,因为它必须将字符串转换为基础列类型。

将日期作为日期类型的变量或参数传递会更容易,更安全。您可以通过这种方式避免整个转换混乱,来回避免SQL注入攻击。

没有理由将字符串而不是日期传递给服务器。所有SQL Server客户端(包括ADO.NET)都允许您执行参数化查询。像NHibernate和Entity Framework这样的ORM也为日期类型的列生成参数化查询。

每当您需要创建字符串文字时,请使用其中一种不变格式,例如201409132012-11-07T18:26:20

您可以在Writing International T-SQL Statements

了解更多相关信息

答案 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