在 MS SQL Server 中将字符串转换为日期时间

Posted

技术标签:

【中文标题】在 MS SQL Server 中将字符串转换为日期时间【英文标题】:Converting a string to a datetime in MS SQL Server 【发布时间】:2016-12-14 15:56:10 【问题描述】:

选择 CONVERT(datetime, '12/16/2001 11:00:00 PM', ???)

通过查看 https://msdn.microsoft.com/en-us/library/ms187928.aspx ,我找不到可以与 Convert 函数一起用于此类日期的有效样式。我总是收到错误“从字符串转换日期和/或时间时转换失败”

有什么想法吗?

【问题讨论】:

你使用的是什么版本的sql server?转换为日期时间时不需要提供格式,仅在将日期时间转换为字符串时才需要格式。只需使用 select CONVERT(datetime, '12/16/2001 11:00:00 PM') 这应该可以正常工作。 替换???与 101 @M.Ali 这是错误的!试试这个select CONVERT(datetime, '01/02/2001 11:00:00 PM', 101),CONVERT(datetime, '01/02/2001 11:00:00 PM', 103)...默认设置可能工作正常 - 或者不行...... @M.Ali 格式参数告诉函数如何解释字符串文字。如果01/02/2000 被视为二月一日或一月二日,则取决于您的系统设置。永远不要依赖这个...... @M.Ali 不,我没有混淆任何东西!我知道什么是culture,什么是format。但是默认格式是与系统文化绑定的。您的第一条评论是完全错误的(但已经得到了 3 个 UPS ......)。永远不要依赖默认值!因此,在 没有第三个参数的日期文字上调用 CONVERT 是在赌博! 【参考方案1】:

CONVERT 需要适当的参数才能知道如何解析日期字符串。

查看at this link 了解详情。

您的案例需要101:

select CONVERT(datetime, '12/16/2001 11:00:00 PM', 101)

如果这在您的控制之下,您应该避免使用任何与文化相关的日期文字。最适合 DateTime - 如果您必须输入一个带时间的日期 - 是ODBC

SELECT ts'2001-12-16 23:00:00';

或 ISO 8601

SELECT CONVERT(DATETIME,'2001-12-16T23:00:00',126);

Here's a related answer

And here's another one

【讨论】:

【参考方案2】:

在大多数情况下,您不需要找到正确的格式。 SQL Server 的卓越之处在于它能够识别出大多数看起来像 DATETIME 的事物的再现。我很确定您不会在下面的示例代码中找到大多数转换的格式编号,但所有格式都使用 DATETIME 进行了正确的转换,根本没有任何格式编号。

在相同的代码中,您还会看到 DATETIME2 的实现有多糟糕。如果您需要一个 DATETIME 不支持 DATETIME2 的理由,这是一个主要原因!

--===== Set the language for this example.
    SET LANGUAGE ENGLISH --Same a US-English
;
--===== Use a table constructor as if it were a table for this example.
 SELECT *
        ,DateTimeCONVERT  = TRY_CONVERT(DATETIME,StringDT)
        ,DateTimeCAST     = TRY_CAST(StringDT AS DATETIME)
        ,DateTime2CONVERT = TRY_CONVERT(DATETIME2,StringDT)
        ,DateTime2CAST    = TRY_CAST(StringDT AS DATETIME2)
   FROM (
         VALUES
         ('Same Format As In The OP'    ,'12/16/2001 01:51:01 PM')
        ,('Almost Normal'               ,'16 December, 2001 1:51:01 PM')
        ,('More Normal'                 ,'December 16, 2001 01:51:01 PM')
        ,('Time Up Front + Spaces'      ,'   13:51:01  16 December   2001')
        ,('Totally Whacky Format #01'   ,'  16  13:51:01  December   2001')
        ,('Totally Whacky Format #02'   ,'  16    December 13:51:01  2001  ')
        ,('Totally Whacky Format #03'   ,'  16    December 01:51:01  PM 2001  ')
        ,('Totally Whacky Format #04'   ,' 2001 16    December 01:51:01  PM ')
        ,('Totally Whacky Format #05'   ,' 2001    December 01:51:01  PM  16  ')
        ,('Totally Whacky Format #06'   ,' 2001 16    December  01:51:01 PM  ')
        ,('Totally Whacky Format #07'   ,' 2001 16    December  13:51:01 PM  ')
        ,('Totally Whacky Format #08'   ,' 2001 16  13:51:01 PM  December    ')
        ,('Totally Whacky Format #09'   ,'   13:51:01   PM  2001.12/16 ')
        ,('Totally Whacky Format #10'   ,'   13:51:01   PM  2001.December/16 ')
        ,('Totally Whacky Format #11'   ,'   13:51:01   PM  2001.Dec/16 ')
        ,('Totally Whacky Format #12'   ,'   13:51:01   PM  2001.Dec.16 ')
        ,('Totally Whacky Format #13'   ,'   13:51:01   PM  2001/Dec.16')
        ,('Totally Whacky Format #14'   ,'   13:51:01   PM  2001 . 12/16 ')
        ,('Totally Whacky Format #15'   ,'   13:51:01   PM  2001 . December / 16 ')
        ,('Totally Whacky Format #16'   ,'   13:51:01   PM  2001 . Dec /   16 ')
        ,('Totally Whacky Format #17'   ,'   13:51:01   PM  2001 . Dec .   16 ')
        ,('Totally Whacky Format #18'   ,'   13:51:01   PM  2001 / Dec .   16')
        ,('Totally Whacky Format #19'   ,'   13:51:01   PM  2001 . Dec -   16 ')
        ,('Totally Whacky Format #20'   ,'   13:51:01   PM  2001 - Dec -   16 ')
        ,('Totally Whacky Format #21'   ,'   13:51:01   PM  2001 - Dec .   16')
        ,('Totally Whacky Format #22'   ,'   13:51:01   PM  2001 - Dec /   16 ')
        ,('Totally Whacky Format #23'   ,'   13:51:01   PM  2001 / Dec -   16')
        ,('Just the year'               ,' 2001      ')
        ,('YYYYMM'                      ,' 200112      ')
        ,('YYYY MMM'                    ,'2001 Dec')
        ,('YYYY-MMM'                    ,'2001-Dec')
        ,('YYYY    .     MMM'           ,'2001    .     Dec')
        ,('YYYY    /     MMM'           ,'2001    /     Dec')
        ,('YYYY    -     MMM'           ,'2001    /     Dec')
        ,('Forgot The Spaces #1'        ,'2001December26')
        ,('Forgot The Spaces #2'        ,'2001Dec26')
        ,('Forgot The Spaces #3'        ,'26December2001')
        ,('Forgot The Spaces #4'        ,'26Dec2001')
        ,('Forgot The Spaces #5'        ,'26Dec2001 13:51:01')
        ,('Forgot The Spaces #6'        ,'26Dec2001 13:51:01PM')
        ,('Oddly, this doesn''t work'   ,'2001-12')
        ,('Oddly, this doesn''t work'   ,'12-2001')
        ) v (Description,StringDT)
;

我无法发布足够大的图形来获取所有结果,因此只需运行代码即可查看我在说什么。

【讨论】:

以上是关于在 MS SQL Server 中将字符串转换为日期时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中将字符串转换为日期时间?

在函数 SQL Server 中将字符串转换为日期时间

SQL Server:在 case 语句中将 UniqueIdentifier 转换为字符串

JPA,Hibernate和Spring Data:在MS SQL服务器上的where子句中将字符串转换为数字

在 SQL Server 中将 varchar 转换为 datetime [重复]

在 PHP Laravel 中的 SQL Server 中将字符串转换为日期数据类型