我有一个字段varchar(14) = 20090226115644
我需要把它转换成-> 2009-02-26 11:56:44 (日期格式)
我的主意。使用铸造和转换..。但我总是有错误。
从字符串转换日期时间时,转换失败。
我做的,但不喜欢.
SELECT
SUBSTRING(move,1,4) + '-' + SUBSTRING(move,5,2) + '-' + SUBSTRING(move,7,2) + ' ' + SUBSTRING(move,9,2) + ':' + SUBSTRING(move,11,2) + ':'+SUBSTRING(move,13,2) as new --
FROM [Test].[dbo].[container_events]
where move IS not null结果:2009-02-26 11:56:44
发布于 2010-05-21 08:53:34
Server中的CAST操作符有一个定义良好的格式列表,支持这些格式--参见MSDN Server联机丛书。
您的格式似乎不适合您自己定义的任何格式->,您必须使用一些自定义逻辑(就像您所做的那样),将这个varchar字段转换成一个可以理解的格式。
那么你现在的问题是什么?
发布于 2010-05-21 12:32:18
您的逻辑看起来是正确的,并且适用于给定的数据。不过,我敢打赌你肯定有一些不好的数据。
试试这个:
DECLARE @container_events table (PK int, move varchar(14))
SET NOCOUNT ON
INSERT INTO @container_events VALUES (1,'20090226115644')
INSERT INTO @container_events VALUES (2,'20090226116644')
INSERT INTO @container_events VALUES (3,'20090227010203')
INSERT INTO @container_events VALUES (4,'20090228010203')
INSERT INTO @container_events VALUES (5,'20090229010203')
SET NOCOUNT OFF
---list all bad dates
SELECT
SUBSTRING(move,1,4) + '-' + SUBSTRING(move,5,2) + '-' + SUBSTRING(move,7,2) + ' ' + SUBSTRING(move,9,2) + ':' + SUBSTRING(move,11,2) + ':'+SUBSTRING(move,13,2) as BadDatesOnly, move
FROM @container_events
where ISDATE(SUBSTRING(move,1,4) + '-' + SUBSTRING(move,5,2) + '-' + SUBSTRING(move,7,2) + ' ' + SUBSTRING(move,9,2) + ':' + SUBSTRING(move,11,2) + ':'+SUBSTRING(move,13,2))=0
---list all bad dates
SELECT
CONVERT(datetime,SUBSTRING(move,1,4) + '-' + SUBSTRING(move,5,2) + '-' + SUBSTRING(move,7,2) + ' ' + SUBSTRING(move,9,2) + ':' + SUBSTRING(move,11,2) + ':'+SUBSTRING(move,13,2)) as GoodDatesOnly, move
FROM @container_events
where ISDATE(SUBSTRING(move,1,4) + '-' + SUBSTRING(move,5,2) + '-' + SUBSTRING(move,7,2) + ' ' + SUBSTRING(move,9,2) + ':' + SUBSTRING(move,11,2) + ':'+SUBSTRING(move,13,2))=1产出:
BadDatesOnly move
------------------- --------------
2009-02-26 11:66:44 20090226116644
2009-02-29 01:02:03 20090229010203
(2 row(s) affected)
GoodDatesOnly move
----------------------- --------------
2009-02-26 11:56:44.000 20090226115644
2009-02-27 01:02:03.000 20090227010203
2009-02-28 01:02:03.000 20090228010203
(3 row(s) affected)使用ISDATE (事务-SQL)函数,您可以确定日期是否有效。因此,您可以筛选出查询中的坏行,或者查找坏行并修复它们,等等,这取决于您如何处理坏数据。
https://stackoverflow.com/questions/2880648
复制相似问题