2014-10-20 69 views
-4

我有下面的整数格式fetchtime列的表:SQL整型转换为DateTime

20100903063110 
20110403022433 
20130203142033 
20130103153313 

等。其中,这将是日期和时间一起(YYYYMMDDHHMISS

我需要的所有记录转换在此列到SQL Server DateTime格式:YYYY-MM-DD HH:MI:SS

一旦做到这一点,我想提取转换的日期和时间格式分开存储在同一张表的两个新列中。

在寻找这个时,我发现了下面提到的@Andomar使用子字符串的转换,但无法使其适应我的要求。

select 
    convert(datetime, substring(sub.Dt,1,4) + '-' + 
        substring(sub.Dt,5,2) + '-' + 
        substring(sub.Dt,7,2) + ' ' + 
        substring(sub.Dt,9,2) + ':' + 
        substring(sub.Dt,11,2) + ':' + 
        substring(sub.Dt,13,2)) 
from  
    (select '20100101000000' as Dt) sub 
+2

convert/substr有什么问题?它看起来像它做你想要的? – 2014-10-20 15:17:55

+3

尽管该值可能会巧合地存储为数字类型,但出于转换目的,该数字没有有意义的日期/时间表示。为此,它需要被视为一个字符串。现有的方法(从子串构造日期/时间)似乎是合理的。 – David 2014-10-20 15:20:04

+0

@AlexK。谢谢回复。是的,它只转换'20100101000000'值。我怎么能用这个来转换列中的所有记录? – Jain 2014-10-20 15:22:38

回答

0

耆那教,它看起来像你想的代码in the answer here适应自己的情况。 Andomar在那里做的是从一个只包含单个值的子查询中选择信息,因为他无法访问原始海报的源代码和表格。这样做可以让每个人都可以运行并查看它,无论他们碰巧拥有哪种数据库模式。

将这样的内容适配到自己的代码中将非常简单:只需将alias.column引用(这里是sub.Dt)替换为您自己的值,然后将您的表放入FROM子句而不是子查询中。因此,如果你的表被命名为SomeTable,和您的列被命名为FetchTime,查询变为:

select 
    convert(datetime, substring(SomeTable.FetchTime,1,4) + '-' + 
        substring(SomeTable.FetchTime,5,2) + '-' + 
        substring(SomeTable.FetchTime,7,2) + ' ' + 
        substring(SomeTable.FetchTime,9,2) + ':' + 
        substring(SomeTable.FetchTime,11,2) + ':' + 
        substring(SomeTable.FetchTime,13,2)) 
from  
    SomeTable 

理论上你就可以有一个问题,如果你FetchTime场被存储为整数:SUBSTRING()可能不会对这些数据的工作类型。要解决这一点,你可以CAST()价值为varchar,就像这样:

select 
    convert(datetime, substring(CAST(SomeTable.FetchTime AS VARCHAR(20)),1,4) + '-' + 
        substring(CAST(SomeTable.FetchTime AS VARCHAR(20)),5,2) + '-' + 
        substring(CAST(SomeTable.FetchTime AS VARCHAR(20)),7,2) + ' ' + 
        substring(CAST(SomeTable.FetchTime AS VARCHAR(20)),9,2) + ':' + 
        substring(CAST(SomeTable.FetchTime AS VARCHAR(20)),11,2) + ':' + 
        substring(CAST(SomeTable.FetchTime AS VARCHAR(20)),13,2)) 
from  
    SomeTable 

或者,如果你只是单值之后,就可以回到原来的查询和简单的写:

select 
    convert(datetime, substring(sub.Dt,1,4) + '-' + 
        substring(sub.Dt,5,2) + '-' + 
        substring(sub.Dt,7,2) + ' ' + 
        substring(sub.Dt,9,2) + ':' + 
        substring(sub.Dt,11,2) + ':' + 
        substring(sub.Dt,13,2)) 
from  
    (select CAST(FetchTime AS VARCHAR(20)) as Dt FROM SomeTable) sub 
+0

AHiggins非常感谢你,你救了我的一天。这就是我正在寻找的:)现在,我已将列的所有值转换为SQL DateTime格式。 – Jain 2014-10-20 20:56:17