在MS SQL Server中将字符串转换为日期时间
选择转换(日期时间,'12/16/2001 11:00:00 PM',?) 通过查看,我找不到可用于此日期类型的转换函数的有效样式。我总是收到错误“从字符串转换日期和/或时间时转换失败”在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-如果您必须键入
有什么想法吗?
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
,就是赌博!