首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server varchar到日期时间

Server varchar到日期时间
EN

Stack Overflow用户
提问于 2010-05-21 08:44:06
回答 2查看 717关注 0票数 2

我有一个字段varchar(14) = 20090226115644

我需要把它转换成-> 2009-02-26 11:56:44 (日期格式)

我的主意。使用铸造和转换..。但我总是有错误。

从字符串转换日期时间时,转换失败。

我做的,但不喜欢.

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-21 08:53:34

Server中的CAST操作符有一个定义良好的格式列表,支持这些格式--参见MSDN Server联机丛书

您的格式似乎不适合您自己定义的任何格式->,您必须使用一些自定义逻辑(就像您所做的那样),将这个varchar字段转换成一个可以理解的格式。

那么你现在的问题是什么?

票数 1
EN

Stack Overflow用户

发布于 2010-05-21 12:32:18

您的逻辑看起来是正确的,并且适用于给定的数据。不过,我敢打赌你肯定有一些不好的数据。

试试这个:

代码语言:javascript
复制
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

产出:

代码语言:javascript
复制
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)函数,您可以确定日期是否有效。因此,您可以筛选出查询中的坏行,或者查找坏行并修复它们,等等,这取决于您如何处理坏数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2880648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档