我试图将字符串日期转换为sql server中的datetime数据类型。这个问题是在另一个论坛上提出的,但我的情况有点不同 这些是字符串日期的可能性
tt= AM or PM M/D/YYYY h:mm tt M/DD/YYYY h:mm tt MM/D/YYYY h:mm tt MM/DD/YYYY h:mm tt M/D/YYYY hh:mm tt M/DD/YYYY hh:mm tt MM/D/YYYY hh:mm tt MM/DD/YYYY hh:mm tt中提出了同样的问题
并给出了解决方案
DECLARE @formats TABLE (notADateTime VARCHAR(30))
INSERT INTO @formats (notADateTime) VALUES
('1/1/2015 1:01:12 AM'), ('1/01/2015 1:12:12 PM'), ('12/2/2015 1:11:12 AM'), ('08/13/2015 1:22:44 PM'),
('1/1/2015 10:01:11 PM'),('1/01/2015 10:12:12 AM'),('12/2/2015 12:5:12 AM'),('08/13/2015 01:44:55 AM')
SELECT *,
LEFT(RIGHT(notADateTime,CHARINDEX('/',REVERSE(notADateTime))-1),4) + '-' +
RIGHT('00'+LEFT(notADateTime,CHARINDEX('/',notADateTime)-1),2) + '-' +
RIGHT('00'+REPLACE(SUBSTRING(notADateTime,CHARINDEX('/',notADateTime)+1,2),'/',''),2) + ' ' +
RIGHT('00'+CAST(CASE WHEN RIGHT(notADateTime,2) = 'PM' THEN 12 ELSE 0 END + RIGHT('00'+REPLACE(LEFT(notADateTime,CHARINDEX(':',notADateTime)-1),' ','0'),2) AS VARCHAR),2) + ':' +
RIGHT('00'+REPLACE(SUBSTRING(notADateTime,CHARINDEX(':',notADateTime)+1,2),':',''),2) + ':' +
REVERSE(LEFT(RIGHT(notADateTime,CHARINDEX(':',REVERSE(notADateTime))-1),2))
FROM @formats
然而,没有给出任何解释,不同之处在于我尝试使用字符串中的秒进行相同的转换。当我运行该代码时,我得到一个错误,因为正确的函数整数是不正确的。 任何帮助/解释都会非常有帮助
答案 0 :(得分:1)
正在进行字符串操作以将其转换为可识别的ISO标准格式。如果不这样做,可能会因混淆日期和月份而使CAST / CONVERT出错,因为不同的文化使用不同的日期格式。例如,2015年12月2日可能代表12月2日或2月12日。
提供的答案以ISO格式“YYYY-MM-DD HH:mm:ss”创建一个字符串。 SELECT
提取年份后的第一行并附加连字符,之后的行是月份和连字符,依此类推。我假设你发现那篇文章中的部分,其中OP在接受的答案中指出了错误。
我假设您知道每个函数的作用(如果不这样,您可以在MSDN上搜索定义 - 现在就这样做,或者后面的内容没有意义)。但是,当这些函数一起使用时,它可能有助于解释解决方案中使用的一些模式。
CHARINDEX('/',REVERSE(notADateTime))
正在查看字符串从前到后并找到第一个 /
(因为字符串是向后的,这是最后一个/
})。因此,当与'RIGHT'结合使用时,RIGHT(notADateTime,CHARINDEX('/',REVERSE(notADateTime))-1)
会在最终/
之后返回字符串的右端。
RIGHT('00'+*value*,2)
用于确保某些值(如小时,分钟,天和月)有两位数。 2意味着他们想要最后两个字符(这将是数字,因为这是一个数字)。请注意,'00'只需要为'0',因为任何整数总是有一位数。
一旦它以该格式包装在CAST到DATETIME2中,所以它不再是字符串。
现在你有这种理解,你应该能够自己解决这个问题。请记住解决方案预期的秒数,这是您的字符串所没有的。如果您需要通过添加评论来获得更多帮助,请与我们联系。