【问题标题】:SQL Convert Integer to DateTime [closed]SQL将整数转换为日期时间[关闭]
【发布时间】:2014-10-20 15:13:59
【问题描述】:

我有一个表格,其列 fetchtime 采用以下整数格式:

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

【问题讨论】:

  • convert/substr 有什么问题?它看起来像你想要的那样?
  • 虽然该值可能会巧合地存储为数字类型,但出于转换目的,该数字没有有意义的日期/时间表示。为此,它需要被视为一个字符串。现有的方法(从子字符串构造日期/时间)似乎是合理的。
  • @AlexK。谢谢回复。是的,它只转换“20100101000000”值。我如何使用它来转换列中的所有记录?

标签: sql sql-server tsql datetime


【解决方案1】:

Jain,您似乎正在尝试使代码 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

【讨论】:

  • AHiggins 非常感谢你,你拯救了我的一天。这就是我一直在寻找的 :) 现在我已将列的所有值转换为 SQL DateTime 格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多