在SQL Server中将时间值转换为整数

3

我需要将时间值转换为整数值。

例如:如果时间值为'07:00 PM',我需要将其转换为19

我尝试过以下查询来实现此目的。

select CAST(substring(CONVERT(varchar,convert(smalldatetime,'07:00 PM'),114), 1,2) as int) as VALUE

它返回了我想要的输出。但在处理大交易时,它需要太多时间。有人能建议一个替代方案(也许是简单的)吗?

我不能使用datepart(hour, 'timevalue')。因为有带有时间值'00:00 AM''00:00 PM'的数据,这会导致转换错误。在这种情况下,我需要返回值为0


你的时间值是以文本形式存储的吗?它们是否总是遵循格式:hh:mm AM/PM? - David Rushton
存储在 varchar 中的值。是的,它们遵循格式。 - bmsqldev
1
我在下面发布了一个可行的解决方案。还应该指出,00:00 PM是无效的时间,这是导致您转换错误的原因。00:00 AM是有效的(午夜)。00:00 PM不存在。 - David Rushton
@destination-data 感谢您指出这一点。00:00 PM 是无效的时间。 - bmsqldev
5个回答

4

看起来您想从时间中提取小时。请使用datepart()函数:

select datepart(hour, timecol)

谢谢。但它不能与“00:00 PM”或“00:00 AM”一起使用。 - bmsqldev
@bmsqldev……我不确定你的意思。SQL Server有定义良好的时间常量格式,并且datepart()适用于time值。也许它不能实现你期望的功能,但它确实从语言指定的时间中提取了正确的小时数。 - Gordon Linoff

2

通过使用DATEPART() ...

DECLARE @DATE DATETIME =  N'07:00 PM'

SELECT DATEPART(hh, @DATE)

谢谢。但它不能与“00:00 PM”或“00:00 AM”一起使用。 - bmsqldev

1
尝试这个查询。
DECLARE @test_date DATETIME

SET @test_date = N'07:00 PM'

SELECT DATEPART(hh, @test_date)

谢谢。但它无法与“00:00 PM”或“00:00 AM”一起使用。 - bmsqldev
在这种情况下,您可以简单地省略上午或下午的注释。 - fabulaspb

1
这个例子假设:
A) 您将时间存储为字符串。
B) 格式始终为HH:MM AM/PM。
数据中的假设可能是非常危险的。特别是对于可能包含边缘值的大型数据集。如果可能的话,我建议将时间存储为TIME。这将允许您在SQL Server中使用许多日期/时间函数。它还将限制可以输入的值。
此示例使用以下示例数据:
样本数据
/* Example uses data below.
 */
DECLARE @Sample TABLE
    (
        TimeValue VARCHAR(8)
    )
;

INSERT INTO @Sample
    (
        TimeValue
    )
VALUES    
    ('00:00 AM'),
    ('07:00 AM'),
    ('07:00 PM')
;

由于格式是固定的,我们可以依靠前两个字符来表示小时,最后两个字符告诉我们是否处理上午或下午。
例子
/* Using LEFT and RIGHT to read the text value.
 */
SELECT
    TimeValue,        
    LEFT(TimeValue, 2) + CASE WHEN RIGHT(TimeValue, 2) = 'PM' THEN 12 ELSE 0 END
FROM
    @Sample
;

1

首先将12小时制转换为24小时制,方法如下:

convert(char(5),cast('07:00 PM' as datetime),108)

然后使用DatePart函数,如下所示:
select datepart(hour,
 convert(char(5),cast('07:00 PM' as datetime),108) )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接