我已经做了一个转换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。我该如何解决这个问题?
答案 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
如果您使用802
或0802
,您将获得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