Ash*_*sht 7 sql sql-server sql-server-2014
我的表中有一栏.我们在其中以格式存储字符串值.在'HH:MM'
使用此表获取记录时,每个东西都可以正常工作
DATEDIFF(MINUTE, '00:00', ColumnName)
Run Code Online (Sandbox Code Playgroud)
问题是我们的价值大于23:59
.它的显示错误就像
从字符串转换日期和/或时间时转换失败.
任何人都可以建议我采用正确的方法来实现这种情况.
如果您将值存储为时间之外的其他内容,为什么不只是存储分钟数并转换为您想要输出的任何格式?
否则,我建议你只需将值转换为分钟:
select (cast(left(ColumnName, 2) as int) * 60 +
cast(right(ColumnName, 2) as int)
) as Minutes
Run Code Online (Sandbox Code Playgroud)
如果你不使用的日期/时间值,存在使用功能没有要求专门为他们设计的.
编辑:
要处理超过99小时,请使用charindex()
:
select (cast(left(ColumnName, charindex(':', ColumnName) - 1) as int) * 60 +
cast(right(ColumnName, 2) as int)
) as Minutes
Run Code Online (Sandbox Code Playgroud)
所以听起来你节省了一个时间段的长度。尝试在几分钟内存储它。我的查询可以处理不同长度的数字,因为它基于冒号。
DECLARE @yourTable TABLE (ColumnName VARCHAR(10));
INSERT INTO @yourTable
VALUES ('100:00'),
('24:20');
SELECT ColumnName,
(hr * 60) + minut AS time_period_in_minutes
FROM @yourTable
CROSS APPLY (SELECT CAST(SUBSTRING(ColumnName,0,CHARINDEX(':',ColumnName)) AS INT),
CAST(SUBSTRING(ColumnName,CHARINDEX(':',ColumnName) + 1,LEN(ColumnName)) AS INT)) CA(hr,minut)
Run Code Online (Sandbox Code Playgroud)
结果:
ColumnName time_period_in_minutes
---------- ----------------------
100:00 6000
24:20 1460
Run Code Online (Sandbox Code Playgroud)