在 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:在 case 语句中将 UniqueIdentifier 转换为字符串
JPA,Hibernate和Spring Data:在MS SQL服务器上的where子句中将字符串转换为数字