【问题标题】:Which settings provide SQL Server default datetime format?哪些设置提供 SQL Server 默认日期时间格式?
【发布时间】:2014-11-19 07:58:04
【问题描述】:

说,我有一张这样的桌子:

表名“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 ?

谢谢

【问题讨论】:

  • 使用日期参数而不是字符串或使用其中一种固定格式。转换格式由服务器/数据库/列排序规则控制
  • @Panagiotis Kanavos,这个字符串格式('11/19/2014 1:29 PM')来自我的应用程序(.Net)。
  • 然后更改应用程序以使用带有日期参数的参数化查询。当您可以简单地将日期时间作为 DateTime 参数传递时,无需使用转换为字符串。实际上用 .NET 编写也更容易

标签: sql-server datetime


【解决方案1】:

不要那样做!不要使用字符串而非日期,不要使用文化特定日期或日期时间格式,它是一个灾难。

SQL Server不具有“日期格式”,只是格式化它使用日期转换为与字符串。其中之一是缺省情况下,服务器的排序控制。你既不能假设也不应该依赖于特定的排序,所以你应该避免转换只要有可能。此外,传递字符串值可以防止SQL Server上使用日期列索引,因为它必须将字符串转换为基础列类型。 P>

这是更容易,更安全的传递日期为日期类型的变量或参数。你避免整个转换乱七八糟这种方式,向和从并避免SQL注入攻击。 P>

有没有理由来传递字符串,而不是日期的服务器。所有SQL Server客户端(包括ADO.NET)允许你执行参数化查询。像NHibernate和实体框架的ORM还产生用于日期类型的列参数的查询。 P>

每当你需要创建一个字符串,的不变格式,如使用一个201409132012-11-07T18:26:20 P>

可以在Writing International T-SQL Statements P>阅读更多关于它

【讨论】:

    【解决方案2】:

    sqlserver的格式是yyyy-mm-dd,但是你可以通过执行命令来定义你的输入

    set 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 格式。因此,如果您将日期指定为 19/11/2014 ,它将转换为 11/19/2014 表示 2014 年 11 月 19 日。

    但是如果你在中间部分给出超过12,它不会隐式转换并抛出转换错误。

    除了 mmddyyyy 格式,您必须显式使用 to cast 或 convert 函数以允许数据插入或更新。

    在转换之前,您可以在 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
    

    【讨论】:

    • 在运行大型插入脚本时非常有用。不过最好不要使用其他方式。
    • 根本没用而且很危险。不要将服务器的日期更改为字符串转换格式,而是使用与文化无关的 ISO 格式 ('20140911') 并避免整个转换问题。
    • Re 'sqlserver 的格式是 mm-dd-yyyy' - 抱歉,这显然是错误的。在某些情况下,可能取决于会话语言和区域设置等,但通常不是。
    • 使用正确的数据类型或国际格式,您无需执行任何操作。如果您避免传递字符串而不是日期,或者使用YYYYMMDDYYYY-MM-DDThh:mm:ss 等国际格式,则无需转换或转换任何内容。
    • 是的,但问题是要保存在日期列中的非标准格式字符串...亲爱的...
    猜你喜欢
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多