将时间数据类型转换为AM PM格式:

70

我有一张表,其中包含两个字段 "StartTime" 和 "EndTime",这两列的数据类型都是时间(Time)。

因此,表的值看起来如下:

TableA:

            StartTime                EndTime
       ------------------         ----------------
        17:30:00.0000000          17:57:00.0000000

但是我需要的结果是

            StartTime                EndTime
       ------------------         ----------------
            05:30 PM                 05:57 PM

当我选择表格时,如何以AM PM格式获取时间?

16个回答

105

90

使用以下语法将时间转换为AM PM格式。

在以下查询中,用值替换字段名称。

select CONVERT(varchar(15),CAST('17:30:00.0000000' AS TIME),100)

输出:下午5:30

在 Sql 2012 中有更好的选择。第一个参数应该是 datetime 数据类型。

DECLARE @d DATETIME = '10/01/2011 13:14';
SELECT FORMAT(@d,'hh:mm tt') 

输出:01:14 PM


4
我们该如何在分钟和AM/PM之间添加空格? - Afshin Moazami
3
虽然不美观,但以下是一种添加空格的方法: SELECT REPLACE(REPLACE(CONVERT(varchar(15), CAST('17:30:00.0000000' AS TIME), 100), 'P', ' P'), 'A', ' A') - hurleystylee
1
@hurleystylee,可能还有其他间接的方法来在AM/PM之前加上空格,你的解决方案就是其中之一。感谢您的贡献。 - Romil Kumar Jain
1
@RahulHendawe 尝试声明 @a smallint =17; 选择 CONVERT(varchar(15),CAST(cast (@a as varchar(2)) + ':0:0' AS TIME),100) - Romil Kumar Jain
1
@RahulHendawe 24:00:00 不是一个有效的时间,所以它会报错。应该是 00:00:00 :) - Romil Kumar Jain
显示剩余9条评论

17

以下是您可以根据自己的需求使用不同的方式来提取它。

使用时间数据类型:

DECLARE @Time Time = '15:04:46.217'
SELECT --'3:04PM'
       CONVERT(VarChar(7), @Time, 0),

       --' 3:04PM' --Leading Space.
       RIGHT(' ' + CONVERT(VarChar(7), @Time, 0), 7),

       --' 3:04 PM' --Space before AM/PM.
       STUFF(RIGHT(' ' + CONVERT(VarChar(7), @Time, 0), 7), 6, 0, ' '),

       --'03:04 PM' --Leading Zero.  This answers the question above.
       STUFF(RIGHT('0' + CONVERT(VarChar(7), @Time, 0), 7), 6, 0, ' ')

       --'03:04 PM' --This only works in SQL Server 2012 and above.  :)
       ,FORMAT(CAST(@Time as DateTime), 'hh:mm tt')--Comment out for SS08 or less.

使用 DateTime 数据类型:

DECLARE @Date DateTime = '2016-03-17 15:04:46.217'
SELECT --' 3:04PM' --No space before AM/PM.
       RIGHT(CONVERT(VarChar(19), @Date, 0), 7),

       --' 3:04 PM' --Space before AM/PM.
       STUFF(RIGHT(CONVERT(VarChar(19), @Date, 0), 7), 6, 0, ' '),

       --'3:04 PM' --No Leading Space.
       LTRIM(STUFF(RIGHT(CONVERT(VarChar(19), @Date, 0), 7), 6, 0, ' ')),

       --'03:04 PM' --Leading Zero.
       STUFF(REPLACE(RIGHT(CONVERT(VarChar(19), @Date, 0), 7), ' ', '0'), 6, 0, ' ')

       --'03:04 PM' --This only works in SQL Server 2012 and above.  :)
       ,FORMAT(@Date, 'hh:mm tt')--Comment line out for SS08 or less.

如果我只想显示上午或下午怎么办? - niq
STUFF is much better than Format - abdul qayyum
@abdulqayyum 同意。我以前使用 FORMAT() 时遇到过巨大的性能问题,所以现在完全避免使用它。虽然它很方便,但代价太高了。你永远不知道这些东西将来会如何影响查询。现在在小数据集上运行良好,但几年后可能会在几千条记录上出现问题。来源:Format is nice and all, but...Beware the Performance Impact of the T-SQL Format Function - MikeTeeVee

8

这将返回类似于 上午11:30 的结果。

select CONVERT(VARCHAR(5), FromTime, 108) + ' ' + RIGHT(CONVERT(VARCHAR(30), FromTime, 9),2)
from tablename

2
这个可以工作;但是你也会得到像14:00 PM这样的结果。 - hurleystylee

4
SELECT CONVERT(varchar, StartTime, 100) AS ST,
       CONVERT(varchar, EndTime, 100) AS ET
FROM some_table

或者

SELECT RIGHT('0'+ LTRIM(RIGHT(CONVERT(varchar, StartTime, 100),8)),8) AS ST,
       RIGHT('0'+ LTRIM(RIGHT(CONVERT(varchar, EndTime, 100),8)),8) AS ET
FROM some_table

最干净的解决方案。 - Kahless
1
当小时数为两位数(10-12)时,此处会多加一个0:010:40AM - RoLYroLLs

3
> SELECT CONVERT(VARCHAR(30), GETDATE(), 100) as date_n_time
> SELECT CONVERT(VARCHAR(20),convert(time,GETDATE()),100) as req_time
> select convert(varchar(20),GETDATE(),103)+' '+convert(varchar(20),convert(time,getdate()),100)

> Result (1):- Jun  9 2018 11:36AM
> result(2):-  11:35AM
> Result (3):-  06/10/2018 11:22AM

3

选择 CONVERT(varchar(15),CAST('17:30:00.0000000' AS TIME),100)

几乎完美,只有空格问题需要解决。 如果更改为:

select CONVERT(varchar(15),CAST('17:30:00.0000000' AS TIME),22)

如果转换的列已经是 TIME 格式,您可以直接引用它,跳过强制类型转换,这样就会获得空间。

最终答案:

select CONVERT(varchar(15),StartTime,22)

1

多个功能,但这将为您提供所需的内容(在SQL Server 2008上进行了测试)

编辑:以下不仅适用于time类型,也适用于datetime类型。

SELECT SUBSTRING(CONVERT(varchar(20),StartTime,22), 10, 11) AS Start, SUBSTRING(CONVERT(varchar(20),EndTime,22), 10, 11) AS End FROM [TableA];


1

试试这个:

select CONVERT(VARCHAR(5), ' 4:07PM', 108) + ' ' + RIGHT(CONVERT(VARCHAR(30), ' 4:07PM', 9),2) as ConvertedTime

1
DECLARE @temp varchar(50)
set @temp = convert(varchar(max),STUFF(STUFF('645P',2,0,':'),5,0,' '))
select @temp

SELECT CASE
        WHEN RIGHT(@temp,1)='P' THEN REPLACE(@temp,'p','PM')
        WHEN RIGHT(@temp,1)='A' THEN REPLACE(@temp,'a','AM')
        END

目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

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