【问题标题】:converting nvarchar to datetime将 nvarchar 转换为日期时间
【发布时间】:2015-09-23 06:14:37
【问题描述】:

我们有一个表,其中包含数据类型为nvarchar(254) 的列。此列按以下格式存储日期和时间:

12-MAR-15 04.07.36.000000000 PM

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

我尝试使用130131,但没有成功。

这里的格式好像是dd-mon-yy hh.mm.ss.mmmmmmm PM

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

任何帮助将不胜感激。

【问题讨论】:

  • 你需要演唱会后的长毫秒吗?

标签: sql sql-server date datetime sql-server-2012


【解决方案1】:

首先,将日期存储为字符串是个坏主意。 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')  )

【讨论】:

  • @Umarkant 如果您对答案感到满意,那么您被要求接受它作为答案。
  • @Anuj Tripathi 完成!昨天错过了,谢谢提醒!
【解决方案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

【讨论】:

    【解决方案3】:

    这可能会帮助你建立你的逻辑

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-17
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 2017-07-15
      相关资源
      最近更新 更多