从 varchar 到 datetime 的 SQL 转换

Posted

技术标签:

【中文标题】从 varchar 到 datetime 的 SQL 转换【英文标题】:SQL conversion from varchar to datetime 【发布时间】:2014-08-18 14:54:30 【问题描述】:

我的 SQL Server 表的其中一列是 mm:ssvarchar 类型,其中 mm = 分钟,ss = 秒。

我需要获得该列的平均值。

我应该先将该列转换为datetime 格式吗?如果是这样,你能告诉我怎么做吗?如果没有,你能告诉我我应该怎么做吗?

这是我将其转换为日期时间的失败尝试:

SELECT CONVERT(DATETIME, '2014-01-01 '+Pace+':00', 108)

其中的速度是varchar,例如23:05

【问题讨论】:

最好的办法是将其转换为int [seconds] 列。 mm > 59 可以吗?如果它的 0 填充在 cast(left(fld,2) * 60 + right(fld,2) as int) 上进行数学运算 Convert varchar into datetime in SQL Server的可能重复 请停止使用 VARCHAR 作为TIMEs。如果您想以另一种格式存储来自 DATETIME 的数据,请考虑使用浮点数 - 它可以直接转换为 DATETIME。存储为 VARCHAR 的 DATETIME 通常是由于糟糕的编程实践,其中有人希望将 UI 数据存储在数据库中,并且懒得以本机形式处理数据。如果您不拥有代码(供应商代码),请为他们感到羞耻! 此外,SQL server 是为基于集合的操作而设计的,RBAR 字符串函数又慢又痛苦!您还必须验证您的数据作为您的演员表以删除尾随空格或无效条目 (99:13)。省去很多麻烦,将列更改为 TIME 并在填写时验证数据。请相信我,从长远来看,您会欣赏这一点的。 您没有提及您正在使用的 SQL Server version - 如果您使用的是当前支持的版本(即 2008或更新),您应该使用 TIME(n) 数据类型(因为这确实是仅时间 - 不涉及日期) 【参考方案1】:

如果您想要平均值,我会将列转换为秒数并使用它:

select avg(pace_secs) as average_in_seconds
from (select cast(left(pace, 2) as int) * 60 + cast(right(pace, 2) as int) as pace_secs
      from t
     ) t;

如果你想恢复格式,那么你可以这样做:

select right('00' + cast(avg(pace_secs) / 60 as int), 2) + ':' +
       right('00' + avg(page_secs) % 60), 2)
    from (select cast(left(pace, 2) as int) * 60 + cast(right(pace, 2) as int) as pace_secs
          from t
         ) t;

【讨论】:

【参考方案2】:
declare @pace varchar(20) = '23:05                    ';

SELECT cast( '2014-01-01 '+cast(@pace as varchar(5))+':00' as datetime)

【讨论】:

谢谢,但我得到了:从字符串转换日期和/或时间时转换失败。 您是否运行了确切的脚本? 你的 [pace] 列是什么类型的? 声明@pace varchar(20) = '23:05'; SELECT cast('2014-01-01'+cast(@pace as varchar(5))+':00' as datetime) ---- 先将其转换为 varchar(5)【参考方案3】:

适用于 SQL2012 及更高版本

SELECT
  FORMAT(DATEADD(second,AVG(DATEDIFF(second,0,'00:'+[Pace])),0),'mm:ss')
FROM MyTable

【讨论】:

以上是关于从 varchar 到 datetime 的 SQL 转换的主要内容,如果未能解决你的问题,请参考以下文章

[SQL Server]从 varchar 数据类型到 datetime 数据类型的转换产生一个超出范围的值。

从 varchar 转换为 datetime 以进行排序

如何将 varchar 日期转换为 datetime2 日期

SQL Server 2008 中的 Varchar 到日期时间

从 Excel 导入 SQL Server:将 varchar 数据类型转换为 datetime 数据类型导致值超出范围

数据库出生日期用啥类型比较好?datetime 或 varchar