我有一个带有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
答案 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。