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

在MS SQL Server中将字符串转换为日期时间,sql,sql-server,Sql,Sql Server,选择转换(日期时间,'12/16/2001 11:00:00 PM',?) 通过查看,我找不到可用于此日期类型的转换函数的有效样式。我总是收到错误“从字符串转换日期和/或时间时转换失败” 有什么想法吗?CONVERT需要适当的参数来了解如何解析日期字符串 寻找细节 您的案例需要101: select CONVERT(datetime, '12/16/2001 11:00:00 PM', 101) 如果这在您的控制之下,您应该避免任何与区域性相关的日期文字。最适合DateTime-如果您必须键入

选择转换(日期时间,'12/16/2001 11:00:00 PM',?)

通过查看,我找不到可用于此日期类型的转换函数的有效样式。我总是收到错误“从字符串转换日期和/或时间时转换失败”


有什么想法吗?

CONVERT
需要适当的参数来了解如何解析日期字符串

寻找细节

您的案例需要
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);


在大多数情况下,您不需要找到正确的格式。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)
;

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

您使用的是哪个版本的sql server?转换为Datetime时不需要提供格式,只有将Datetime转换为字符串时才需要格式。只需使用
select CONVERT(日期时间,'12/16/2001 11:00:00 PM')
???具有101@M.Ali这是错误的!只需尝试以下操作
选择CONVERT(日期时间,'01/02/2001 11:00:00 PM',101),CONVERT(日期时间,'01/02/2001 11:00:00 PM',103)
。。。默认设置可以正常工作,也可以不正常。..@M.Ali格式参数告诉函数如何解释字符串文字。如果将
01/02/2000
视为2月1日或1月2日,则取决于您的系统设置。千万不要相信这个…。@M.Ali不,我什么都不懂!我知道什么是文化,什么是形式。但默认格式与系统的区域性绑定。你的第一个评论是完全错误的(但是已经有3个了…)。人们永远不应该依赖默认值!因此,在没有第三个参数的日期文本上调用
CONVERT
,就是赌博!