从 varchar 到 datetime 的 SQL 转换
Posted
技术标签:
【中文标题】从 varchar 到 datetime 的 SQL 转换【英文标题】:SQL conversion from varchar to datetime 【发布时间】: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)
上进行数学运算
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 日期转换为 datetime2 日期
SQL Server 2008 中的 Varchar 到日期时间
从 Excel 导入 SQL Server:将 varchar 数据类型转换为 datetime 数据类型导致值超出范围