TSQL:将24小时时间转换为AM PM的问题

时间:2014-10-15 12:40:44

标签: sql-server function tsql time

我已经做了一个转换24小时时间的功能(例如0900到9点)。这是功能。

BEGIN
DECLARE @ret varchar(10);
DECLARE @temp varchar(10);
DECLARE @tempHH varchar(10);
DECLARE @AMPM varchar(10);

DECLARE @tempHours int;

Set @ret = cast(@timing as varchar);
Set @temp = @ret;


if len(@timing) = 3
begin
    set @ret = '0' + cast(left(@temp,1) as varchar(5)) + ':'
    set @ret = @ret + right(@temp,2) + ' AM';
end -- if len = 3

if len(@timing) = 4
begin
    Set @tempHours = cast(left(@temp,2) as int);
    set @AMPM = ' AM';

    if @tempHours > 12
    begin
        set @AMPM = ' PM';
        set @tempHours = @tempHours - 12;

    end

    if len(@tempHours)=1
        set @ret = '0'+ cast(@tempHours as varchar(5)) + ':'
    else
        set @ret = cast(@tempHours as varchar(5)) + ':'

    set @ret = @ret + right(@temp,2) + @AMPM;
end --length = 4

if len(@ret)=2
    set @ret = '00:'+ @ret;
return @ret;

END

它工作正常,除了1200到1259之外的所有时间。例如它显示1230的“12:30 AM”,或1210的“12:10 AM”等,其中应显示“12:30 PM “和”分别是12:10 PM。我该如何解决这个问题?

5 个答案:

答案 0 :(得分:0)

编辑我从评论中意识到你得到4位数而没有分号,所以我用STUFF在中间加了一个分号。

如果您知道要获得3位或4位数字,请考虑将其转换为日期,然后返回字符串?

Declare @TimeString VarChar (10) = '1325'

Set @TimeString = Stuff (@TimeString, Len (@TimeString) -1, 0, ':')

Select Right (Replace (Convert (VarChar, cast ('01/01/1900 ' + @TimeString  as datetime), 131), ':00:000', ''), 7) as ConvertedValue

输出

ConvertedValue
--------------
 1:25PM

(1 row(s) affected)

答案 1 :(得分:0)

问题在于您将小时数1200-1259视为< 12,因此永远不会更改为PM。

if @tempHours > 12之前添加此条件以使1200-1259 - &gt; PM:

if @tempHours = 12
begin
    set @AMPM = ' PM';
end

1210的结果为12:10 PM

答案 2 :(得分:0)

我会将输入转换为int(如果你还没有),然后对它做一些简单的数学运算,然后再要求SQL Server将其重新格式化为字符串。

declare @timing int
set @timing = 1205

select RIGHT(CONVERT(varchar(20),
        DATEADD(hour,@timing/100,
        DATEADD(minute,@timing%100,0))
    ,100),7)

结果:

-------
12:05PM

答案 3 :(得分:0)

您应该替换代码:

if @tempHours > 12
    begin
        set @AMPM = ' PM';
        set @tempHours = @tempHours - 12;
    end

with:

if @tempHours >= 12
    set @AMPM = ' PM';

if @tempHours > 12
    set @tempHours = @tempHours - 12;

答案 4 :(得分:0)

如果值存储在24-hour format(即包括时间分隔符)中,您可以转换为time,然后转换为AM / PM格式,例如:

declare @timing varchar(5)='18:02'

declare @time time=cast(@timing as time)
select convert(varchar(50),@time,100)

Result:
----------
6:02PM

您的值使用military format存储,TIMEFROMPARTS没有分隔符,但可以很容易地转换为整数。在这种情况下,数百个对应于小时,而模数100对应于分钟。

在SQL Server 2012+中,您可以使用STUFF从其各个部分创建time值:

declare @timing varchar(4)='1802'

declare @value int=cast(@timing as int)
declare @time time=TIMEFROMPARTS(@value/100,@value % 100,0,0,0)

select convert(varchar(50),@time,100)

Result:
----------
6:02PM

如果您使用8020802,您将获得8:02AM

在以前的版本中,您可以构造有效的时间字符串,然后进行转换和转换。您可以像以前一样转换为int,或者您可以拆分字符串,如下例所示:

declare @timing varchar(4)='1802'

declare @value varchar(5)=  STUFF(@timing,LEN(@timing)-1,0,':')
declare @time time=cast(@value as time)

select convert(varchar(50),@time,100)

最后,您可以使用{{3}}:

在AM / PM字符串前插入一个空格
declare @timing varchar(4)='1802'

declare @value varchar(5)=  STUFF(@timing,LEN(@timing)-1,0,':')
declare @time time=cast(@value as time)
declare @ampm varchar(6)=convert(varchar(6),@time,100)  

select STUFF(@ampm,LEN(@ampm)-1,0,' ')

Result:
--------
6:02 PM