将 Time DataType 转换为 AM PM 格式:

Posted

技术标签:

【中文标题】将 Time DataType 转换为 AM PM 格式:【英文标题】:Convert Time DataType into AM PM Format: 【发布时间】:2012-06-05 09:48:37 【问题描述】:

我有一个表,其中有两个字段,例如“开始时间”和“结束时间”。两列的DataType是Time。

所以表格的值如下所示:

TableA:

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

但我需要结果为

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

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

【问题讨论】:

【参考方案1】:

在 SQL 2012 中,您可以使用 Format() 函数。

https://technet.microsoft.com/en-us/library/hh213505%28v=sql.110%29.aspx

如果列类型为 (datetime),则跳过转换。

示例:

SELECT FORMAT(StartTime,'hh:mm tt') AS StartTime
FROM TableA

【讨论】:

我以前怎么没见过这个??【参考方案2】:

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

将字段名称替换为以下查询中的值。

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

【讨论】:

我们如何在分钟和上午/下午之间添加空格? 这不是很漂亮,但这是添加空格的一种方法:SELECT REPLACE(REPLACE(CONVERT(varchar(15), CAST('17:30:00.0000000' AS TIME), 100), 'P', 'P'), 'A', 'A') @hurleystylee,它们可能是在 AM/PM 之前放置空间的许多其他间接方式,您的解决方案来自其中之一。谢谢你把这个。 @RahulHendawe 尝试声明 @a smallint =17;选择 CONVERT(varchar(15),CAST(cast (@a as varchar(2)) + ':0:0' AS TIME),100) @RahulHendawe 24:00:00 不是有效时间,因此会出错。它应该是 00:00:00 :)【参考方案3】:

以下是您可以使用的各种方法(取决于您的需要)。

使用时间数据类型:

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.

【讨论】:

如果我只想显示 PM 或 AM 怎么办? STUFFFormat 好很多 @abdulqayyum 同意。我之前使用FORMAT() 获得了巨大的性能打击,所以现在我完全避免了它。这很方便,但成本太高了。您永远不知道这些事情将来会如何影响查询。它现在可能在一个小集合上运行良好,但几年后它会在几千张唱片上窒息。来源:Format is nice and all, but...和Beware the Performance Impact of the T-SQL Format Function【参考方案4】:

返回类似于 11:30 AM

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

【讨论】:

这行得通;但是你也会得到像下午 14:00 这样的结果【参考方案5】:
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

【讨论】:

最干净的解决方案。 当小时有 2 位数 (10-12) 010:40AM 时,这会增加一个额外的 0【参考方案6】:
> 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

【讨论】:

【参考方案7】:

选择 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)

【讨论】:

【参考方案8】:

多种功能,但这将为您提供所需的功能(在 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];

【讨论】:

【参考方案9】:

试试这个:

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

【讨论】:

【参考方案10】:

试试这个:

select CONVERT(varchar(15),CAST('2014-05-28 16:07:54.647' AS TIME),100) as CreatedTime

【讨论】:

【参考方案11】:
    select right(convert(varchar(20),getdate(),100),7)

【讨论】:

你能解释一下你的答案吗?【参考方案12】:

使用上面@Saikh 的回答,第二个选项,您可以在时间本身和上午或下午之间添加一个空格。

REVERSE(LEFT(REVERSE(CONVERT(VARCHAR(20),CONVERT(TIME,myDateTime),100)),2) + ' ' + SUBSTRING(REVERSE(CONVERT(VARCHAR(20),CONVERT(TIME,myDateTime),100)),3,20)) AS [Time],

我知道很乱,但这是我选择的解决方案。奇怪的是 CONVERT() 不会自动添加该空间。 SQL Server 2008 R2

【讨论】:

【参考方案13】:
    声明@iniTme TIME = '03:15:30' 声明@endTme TIME = '15:15:30' SELECT FORMAT(CAST(@iniTme AS DATETIME), 'hh:mm tt') SELECT FORMAT(CAST(@endTme AS DATETIME), 'hh:mm tt') 03:15 上午 下午03:15

【讨论】:

以上是关于将 Time DataType 转换为 AM PM 格式:的主要内容,如果未能解决你的问题,请参考以下文章

SQL (HUE) : 有没有办法将 24 小时时间转换为 12 小时 AM / PM 格式与小时桶

将 AM PM 时间字符串存储到 MySQL 中的 TIME 数据类型中,并在显示时使用 AM PM 检索?

如何将日期/时间从 24 小时格式转换为 12 小时 AM/PM? [复制]

将具有 AM/PM 的字符串列转换为 Impala 中的时间戳

SQL - 将 varchar (dd/mm/yyyy hh.mm AM/PM) 转换为日期时间

当用户的设备在 iOS 中设置为 24 小时制时,如何将包含“am/pm”的字符串转换为 NSDate?