2015-07-06 298 views
2

我们有一个表,其中包含数据类型为nvarchar(254)的列。这列存储日期和时间,采用以下格式:将nvarchar转换为datetime

12-MAR-15 04.07.36.000000000 PM 

我们需要将其转换为datetime格式,以便我们可以运行时间相关的查询来提取所需要的结果。此数据不是以CAST and CONVERT documentation page

上提到的任何格式存储的,我尝试使用130131,但没有运气。

格式在这里似乎是dd-mon-yy hh.mm.ss.mmmmmmm PM

有谁知道我们应该如何去将其换算为“日期时间”格式?

任何帮助将不胜感激。

+0

你需要的演唱会后长毫秒? – Ionic

回答

5

首先IT'IS一个坏主意来存储日期为字符串。 This is a one way使用STUFFREPLACE函数将它们转换回日期时间。

我假设你所有的日期是一年后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') ) 
+0

这工作得很好。非常感谢Kaf! – Umakant

+0

@Umarkant如果你对答案满意,那么你被要求接受它作为答案。 –

+0

@ Anuj Tripathi完成!我昨天错过了这个,谢谢你的提醒! – Umakant

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 
2

基本上你需要你的日期字符串转换成SQL Server支持的样式之一。在下面的例子中,我指定日期样式109(mon dd yyyy hh:mi:ss:mmmAM):

-- character position    0  1   2 
--         123456789
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