【问题标题】:Convert Time DataType into AM PM Format:将 Time DataType 转换为 AM PM 格式:
【发布时间】: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 格式的时间?

【问题讨论】:

    标签: sql-server sql-server-2008 select time


    【解决方案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】:
                1. 声明@iniTme TIME = '03:15:30'
                2. 声明@endTme TIME = '15:15:30'
                3. SELECT FORMAT(CAST(@iniTme AS DATETIME), 'hh:mm tt')
                4. SELECT FORMAT(CAST(@endTme AS DATETIME), 'hh:mm tt')
                5. 03:15 上午
                6. 下午03:15

                【讨论】:

                  猜你喜欢
                  • 2010-09-15
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-02-25
                  • 1970-01-01
                  • 2013-04-11
                  • 2017-09-18
                  • 1970-01-01
                  相关资源
                  最近更新 更多