使用 12 小时表示法格式化时间

Format time using 12 hour notation

我做了一个 SQL 查询,它显示日期和时间,时间分为小时和分钟。

select convert(varchar(10),[Date],23) as [Date], 
datepart(hour, [Time])as Hour, datepart(minute, [Time])as Minutes, 
FROM [SQLIOT].[dbo].[ZEPB_CaseLog] 

table 以 24 小时格式显示小时。 但我想改用 12 小时格式,单个数字带有“0”前缀。

即:01、02、03 等

我想到了用case来做:

select convert(varchar(10),[Date],23) as [Date],
case when 
datepart(hour, [Time])> 12 then (datepart(hour, [Time])- 12) as Hour
, datepart(minute, [Time])as Minutes, 
FROM [SQLIOT].[dbo].[ZEPB_CaseLog] 

这样做会给我一个语法错误

datepart(hour, [Time])> 12 then (datepart(hour, [Time])- 12) as Hour

--Incorrect syntax near the keyword 'as'.

我不太熟悉在 SQL 中做减法。我还应该添加什么来解决这个问题吗?

case when 上存在语法错误,请尝试以下操作。

select convert(varchar(10),[Date],23) as [Date]
    , case when datepart(hour, [Time])> 12
    then (datepart(hour, [Time])- 12) 
    else datepart(hour, [Time]) End as Hour
    , datepart(minute, [Time])as Minutes, 
FROM [SQLIOT].[dbo].[ZEPB_CaseLog] 

鉴于您对格式化(即显示)感兴趣,那么让我们使用字符串。

declare @Time time = '09:33:44 pm'

select @Time [Original]
  , format(cast(@Time as datetime),N'hh') [Format Hour] -- SQL Server 2012 + (format works differently for time and datetime - datetime is required here)
  , case when len(convert(varchar(32),@Time,109)) > 17 then convert(varchar(2),@Time,109) else '0' + convert(varchar(1),@Time,109) end [Convert Hour] -- SQL Server pre-2012
  -- If you ultimatly want the hours and minutes together then do it as one
  , format(cast(@Time as datetime),N'hh\:mm') [Format hour:min] -- SQL Server 2012 + (format works differently for time and datetime - datetime is required here)
  , case when len(convert(varchar(32),@Time,109)) > 17 then convert(varchar(5),@Time,109) else '0' + convert(varchar(4),@Time,109) end [Convert hour:min] -- SQL Server pre-2012
  -- And if you want am/pm
  , format(cast(@Time as datetime),N'hh\:mm tt') [Format hour:min tt] -- SQL Server 2012 + (format works differently for time and datetime - datetime is required here)
  , case when len(convert(varchar(32),@Time,109)) > 17 then convert(varchar(5),@Time,109) else '0' + convert(varchar(4),@Time,109) end -- SQL Server pre-2012
  + case when @Time >= '12:00:00' then ' PM' else ' AM' end [Convert hour:min tt] -- SQL Server pre-2012

Returns:

Original            Format Hour Convert Hour    Format hour:min Convert hour:min    Format hour:min tt  Convert hour:min tt
21:33:44.0000000    09          09              09:33           09:33               09:33 PM            09:33 PM

如果您对 adding/subracting 日期感兴趣,请使用 dateadd