我们有一个表,其中包含数据类型为nvarchar(254)
的列。此列按以下格式存储日期和时间:
12-MAR-15 04.07.36.000000000 PM
我们需要将其转换为datetime
格式,以便我们可以运行时间相关的查询来提取所需的结果。此数据不会以CAST and CONVERT documentation page
我尝试使用130
和131
,但没有运气。
此处的格式似乎为dd-mon-yy hh.mm.ss.mmmmmmm PM
有谁知道我们应该如何将其转换为'datetime'格式?
非常感谢任何帮助。
答案 0 :(得分:5)
首先,将日期存储为字符串是一个坏主意。
This is a one way使用STUFF
和REPLACE
函数将它们转换回日期时间。
我假设你的所有日期都是在2000年之后。
declare @d nvarchar(256) = '12-MAR-15 04.07.36.000000000 PM'
SELECT CONVERT(DATETIME,
STUFF(
REPLACE(REPLACE(
STUFF(@d, 23, 7, ''), '-',' '),'.',':'), 8,0,'20') )
答案 1 :(得分:2)
基本上,您需要将日期字符串转换为SQL Server支持的其中一种样式。在以下示例中,我将日期样式109(mon dd yyyy hh:mi:ss:mmmAM
):
-- character position 0 1 2
-- 1234567890123456789012345678
DECLARE @DATESTR AS NVARCHAR(254) = '12-MAR-15 04.07.36.000000000 PM'
SELECT CONVERT(DATETIME,
SUBSTRING(@DATESTR, 4, 3) + ' ' + -- mon
SUBSTRING(@DATESTR, 1, 2) + ' ' + -- dd
SUBSTRING(@DATESTR, 8, 2) + ' ' + -- yy
SUBSTRING(@DATESTR, 11, 2) + ':' + -- hh
SUBSTRING(@DATESTR, 14, 2) + ':' + -- mi
SUBSTRING(@DATESTR, 17, 2) + ':' + -- ss
SUBSTRING(@DATESTR, 20, 3) + -- mmm
RIGHT(@DATESTR, 2) -- am/pm
, 109) AS Converted
-- 2015-03-12 16:07:36.000
答案 2 :(得分:0)
这可能会帮助你构建你的逻辑
SELECT CAST(CONVERT(VARCHAR(9), LEFT('12-MAR-15 04.07.36.000000000 PM',9), 120) AS DATE) DATE_PART ,
CASE WHEN (RIGHT('12-MAR-15 04.07.36.000000000 PM', 2)='PM' AND Substring('12-MAR-15 04.07.36.000000000 PM', 11, 2) <> '12')
THEN Cast(Cast(Substring('12-MAR-15 04.07.36.000000000 PM', 11, 2) AS INT)+12 AS CHAR(2))
WHEN (RIGHT('12-MAR-15 04.07.36.000000000 PM', 2)='AM' AND Substring('12-MAR-15 04.07.36.000000000 PM', 11, 2)='12')
THEN '00'
ELSE Substring('12-MAR-15 04.07.36.000000000 PM', 11, 2) END + ':' + Substring( '12-MAR-15 04.07.36.000000000 PM', 14, 2) TIME_PART