将 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 怎么办?STUFF
比Format
好很多
@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 中的时间戳