在SQL中仅替换字符串的一部分

时间:2016-10-27 10:13:14

标签: sql sql-server sql-server-2012

我有一个带有nvarchar列的表,其中DateTime数据的格式为**You can try this one if it will work for you or other i will correct your code also ** 。我想将此数据转换并更新为YYYY:MM:DD HH:MM:SS格式。

我面临的问题是,如果我使用YYYY-MM-DD HH:MM:SS,则所有REPLACE都会被:取代,例如-格式。

我怎样才能实现这个目标?

现有数据:YYYY-MM-DD HH-MM-SS

2016:10:27 15:39:33之后所需的数据格式:REPLACE

编辑: 我忘了提到该列也有其他DateTime格式的数据,比如

  • 2016-10-27 15:39:33
  • YYYY/MM/DD HH:MM:SS

5 个答案:

答案 0 :(得分:3)

正如@jarlh明智地指出的那样,出于很多原因,你绝对应该避免将日期信息存储为varchar。您将无法利用SQL Server用于处理日期和时间戳的任何功能。

但如果你真的只是出于格式化原因需要这样做,STUFF可能会派上用场:

SELECT STUFF(STUFF(col, 5, 1, '-'), 8, 1, '-')
FROM yourTable

答案 1 :(得分:1)

试试这样:

DECLARE @s VARCHAR(100)='2016:10:27 15:39:33'

SELECT REPLACE(LEFT(@s,10),':','-') + RIGHT(@s,9)

更新您发现了更多不同的格式......

以下内容应全部转换

DECLARE @tbl TABLE(StringDate VARCHAR(100), RealDate DATETIME);
INSERT INTO @tbl(StringDate) VALUES('2016:10:27 15:39:33')
                                 ,('2016/03/23 12:33:44') 
                                 ,('2016-04-24 00:11:22') 
                                 ,('24/03/2016 11:22:33'); 

WITH Cut AS
(
    SELECT REPLACE(REPLACE(LEFT(StringDate,10),':','-'),'/','-') AS DateString
          ,RIGHT(StringDate,8) AS TimeString
          ,RealDate
    FROM @tbl
)
,UpdateableCTE AS
(
    SELECT RealDate
          ,DateString
          ,CASE WHEN CHARINDEX('-',DateString,1)=5 
                THEN CONVERT(DATETIME,DateString + 'T' + TimeString,126) --ISO8601
                ELSE CONVERT(DATETIME,DateString,103) + TimeString END AS ConvertedDate
    FROM Cut
)
UPDATE UpdateableCTE SET RealDate=ConvertedDate;

SELECT * FROM @tbl

答案 2 :(得分:1)

DECLARE @a varchar(max) = 'YYYY:MM:DD HH:MM:SS'

SELECT 
  stuff(stuff(@a, charindex(':', @a),1, '-'), 
  charindex(':', @a, charindex(':', @a) + 1), 1, '-')

答案 3 :(得分:0)

您可以通过多种方式完成此操作。我的方式与子串。

答案 4 :(得分:0)

以下是处理多种日期格式的示例:

CREATE TABLE #Data
(
    date_strings NVARCHAR(20)
)

INSERT INTO #Data
        ( date_strings)
    SELECT N'2016:10:27 15:39:33'
    UNION ALL 
    SELECT N'1912:10:27 15:39:33'
    UNION ALL 
    SELECT N'20:11:2010 15:39:33'
    UNION ALL 
    SELECT N'12:10:1912 15:39:33'
    UNION ALL 
    SELECT N'2016-12-14 15:39:33'

SELECT  date_strings ,
    CASE 
      WHEN CHARINDEX(':', LEFT(date_strings, 10)) > 0
      THEN CASE 
            WHEN CHARINDEX(':', LEFT(date_strings, 10)) = 3
            THEN CONVERT(DATETIME, STUFF(STUFF(date_strings, 3, 1, '-'), 6, 1, '-'), 103)
            ELSE CONVERT(DATETIME, STUFF(STUFF(date_strings, 5, 1, '-'), 8, 1, '-'))
           END
        ELSE CONVERT(DATETIME,date_strings)
    END AS ConvertedValues
FROM    #Data

DROP TABLE #Data

这基本上使用case语句通过查找值的日期部分中:的位置或存在来处理不同格式的日期。

案例1 - 包含:

CHARINDEX(':', LEFT(date_strings, 10)) > 0 -- needs conversion

案例2:

CHARINDEX(':', LEFT(date_strings, 10)) = 3 -- formatted DD:MM:YYYY HH:MM:SS

案例3:

formatted YYYY:MM:DD HH:MM:SS

案例4:

简单地转换它,它已经是正确的格式。

注意,基本STUFF语法取自Tim's answer