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

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

标签: sql sql-server


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2010-09-23
      • 2020-05-22
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多