用三元表达式实现

Jack Wang 2009-06-03 05:04:58
输入一个小时数.
例如
输入25个小时 输出 1天1小时
输入50小时 输出 2天2小时
输入***小时 输出 *月*天*小时
输入*****小时 输出 *年*天*小时
...全文
580 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
allix123 2009-06-04
  • 打赏
  • 举报
回复
mark
chuifengde 2009-06-04
  • 打赏
  • 举报
回复
一天24小时固定,月的天数有大有小,怎么能转换呢?
fuxiaoyang13 2009-06-04
  • 打赏
  • 举报
回复
up up
Jack Wang 2009-06-04
  • 打赏
  • 举报
回复
真的没有办法解决掉吗?
yingzhilian2008 2009-06-04
  • 打赏
  • 举报
回复
系统升级?
yingzhilian2008 2009-06-04
  • 打赏
  • 举报
回复
平年闰年 不一样的啊!不能转吧
Jack Wang 2009-06-03
  • 打赏
  • 举报
回复
那位朋友能做出来帮帮忙
--小F-- 2009-06-03
  • 打赏
  • 举报
回复
应该是 case when else end吧
子陌红尘 2009-06-03
  • 打赏
  • 举报
回复
--考虑到小时可能为0的情况:
create function f_getInfo(@hour int)
returns varchar(8000)
begin
declare @str varchar(8000)
select @str=
(case when datepart(yy,yy)-1900=0 then '' else rtrim(datepart(yy,yy)-1900)+'年' end)+
(case when datepart(yy,yy)-1900=0 or @hour%24=0
then
(case when datepart(mm,yy)-1 =0 then '' else rtrim(datepart(mm,yy)-1) +'月' end)+
(case when datepart(dd,yy)-1 =0 then '' else rtrim(datepart(dd,yy)-1) +'天' end)
else
rtrim(datediff(dd,rtrim(datepart(yy,yy))+'-01-01',yy))+'天'
end)+
(case when hh =0 then '' else rtrim(hh) +'小时' end)
from
(select (case when @hour/24>0 then cast(@hour/24 as datetime) else 0 end) as yy,@hour%24 as hh) t
return @str
end
go


select dbo.f_getinfo(10) --10小时
select dbo.f_getinfo(100) --4天4小时
select dbo.f_getinfo(1000) --1月10天16小时
select dbo.f_getinfo(10008) --1年1月21天
select dbo.f_getinfo(100008) --11年4月30天
go

drop function f_getinfo
go
子陌红尘 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wuyan0319 的回复:]
谢谢大家.我需要三元表达式
[/Quote]


try:
create function f_getInfo(@hour int)
returns varchar(8000)
begin
declare @str varchar(8000)
select @str=
(case when datepart(yy,yy)-1900=0 then '' else rtrim(datepart(yy,yy)-1900)+'年' end)+
(case when datepart(yy,yy)-1900=0
then
(case when datepart(mm,yy)-1 =0 then '' else rtrim(datepart(mm,yy)-1) +'月' end)+
(case when datepart(dd,yy)-1 =0 then '' else rtrim(datepart(dd,yy)-1) +'天' end)
else
rtrim(datediff(dd,rtrim(datepart(yy,yy))+'-01-01',yy))+'天'
end)+
(case when hh =0 then '' else rtrim(hh) +'小时' end)
from
(select (case when @hour/24>0 then cast(@hour/24 as datetime) else 0 end) as yy,@hour%24 as hh) t
return @str
end
go


select dbo.f_getinfo(10) --10小时
select dbo.f_getinfo(100) --4天4小时
select dbo.f_getinfo(1000) --1月10天16小时
select dbo.f_getinfo(10000) --1年51天16小时
select dbo.f_getinfo(100000) --11年149天16小时
go

drop function f_getinfo
go
Jack Wang 2009-06-03
  • 打赏
  • 举报
回复
谢谢大家.我需要三元表达式
ai_li7758521 2009-06-03
  • 打赏
  • 举报
回复
o,没看清..三元..
ai_li7758521 2009-06-03
  • 打赏
  • 举报
回复
-- =============================================
-- Author: <Author:ailly>
-- =============================================
ALTER FUNCTION GetTime(@var int)
RETURNS NVARCHAR(30)
AS
BEGIN

DECLARE @y int,@m int,@d int,@h int,@TimeStr NVARCHAR(80)

IF @var>365*24
BEGIN
SELECT @y=@var/(365*24),@var=@var%(365*24)
SELECT @m=@var/(30*24),@var=@var%(30*24)
SELECT @d=@var/24,@h=@var%24
SET @TimeStr=CAST(@y AS NVARCHAR(20))+'年'+CAST(@m AS NVARCHAR(20))+'月'+CAST(@D AS NVARCHAR(20))+'天'+CAST(@h AS NVARCHAR(20))+'小时'
END
ELSE IF @var>30*24
BEGIN
SELECT @m=@var/(30*24),@var=@var%(30*24)
SELECT @d=@var/24,@h=@var%24
SET @TimeStr=CAST(@m AS NVARCHAR(20))+'月'+CAST(@D AS NVARCHAR(20))+'天'+CAST(@h AS NVARCHAR(20))+'小时'
END
ELSE
BEGIN
SELECT @d=@var/24,@h=@var%24
SET @TimeStr=CAST(@D AS NVARCHAR(20))+'天'+CAST(@h AS NVARCHAR(20))+'小时'
END

RETURN (SELECT @TimeStr)
END


SELECT 时间1=[dbo].[GetTime] (25), 时间2=[dbo].[GetTime] (240),时间3=[dbo].[GetTime] (1000),时间4=[dbo].[GetTime] (10000)

/*
时间1 时间2 时间3 时间4
------------------------------ ------------------------------ ------------------------------ ------------------------------
1天1小时 10天0小时 1月11天16小时 1年1月21天16小时

(1 行受影响)
*/
ws_hgo 2009-06-03
  • 打赏
  • 举报
回复
sql中的三元运算符
就是case when then else end
ai_li7758521 2009-06-03
  • 打赏
  • 举报
回复
-- =============================================
-- Author: <Author:ailly>
-- =============================================
CREATE FUNCTION GetTime(@var int)
RETURNS NVARCHAR(30)
AS
BEGIN

DECLARE @y int,@m int,@d int,@h int,@TimeStr NVARCHAR(80)

IF @var>365*24
BEGIN
SELECT @y=@var/(365*24),@var=@var%(365*24)
SELECT @d=@var/24,@h=@var%24
SET @TimeStr=CAST(@y AS NVARCHAR(20))+'年'+CAST(@D AS NVARCHAR(20))+'天'+CAST(@h AS NVARCHAR(20))+'小时'
END
ELSE IF @var>30*24
BEGIN
SELECT @m=@var/(30*24),@var=@var%(30*24)
SELECT @d=@var/24,@h=@var%24
SET @TimeStr=CAST(@m AS NVARCHAR(20))+'月'+CAST(@D AS NVARCHAR(20))+'天'+CAST(@h AS NVARCHAR(20))+'小时'
END
ELSE
BEGIN
SELECT @d=@var/24,@h=@var%24
SET @TimeStr=CAST(@D AS NVARCHAR(20))+'天'+CAST(@h AS NVARCHAR(20))+'小时'
END

RETURN (SELECT @TimeStr)
END


SELECT 时间1=[dbo].[GetTime] (25), 时间2=[dbo].[GetTime] (240), 时间3=[dbo].[GetTime] (10000)
/*
时间1 时间2 时间3
------------------------------ ------------------------------ ------------------------------
1天1小时 10天0小时 1年51天16小时

(1 行受影响)*/
子陌红尘 2009-06-03
  • 打赏
  • 举报
回复
写得不严谨,还有问题,修改成函数形式:

create function f_getInfo(@hour int)
returns varchar(8000)
begin
declare @str varchar(8000)
select @str=
(case when datepart(yy,yy)-1900=0 then '' else rtrim(datepart(yy,yy)-1900)+'年' end)+
(case when datepart(mm,yy)-1 =0 then '' else rtrim(datepart(mm,yy)-1) +'月' end)+
(case when datepart(dd,yy)-1 =0 then '' else rtrim(datepart(dd,yy)-1) +'天' end)+
(case when hh =0 then '' else rtrim(hh) +'小时' end)
from
(select (case when @hour/24>0 then cast(@hour/24 as datetime) else 0 end) as yy,@hour%24 as hh) t
return @str
end
go


select dbo.f_getinfo(10) --10小时
select dbo.f_getinfo(100) --4天4小时
select dbo.f_getinfo(1000) --1月10天16小时
select dbo.f_getinfo(10000) --1年1月20天16小时
select dbo.f_getinfo(100000) --11年4月29天16小时
go

drop function f_getinfo
go
jia_guijun 2009-06-03
  • 打赏
  • 举报
回复
exec up_get 18018
/*
2年20日18小时
*/
jia_guijun 2009-06-03
  • 打赏
  • 举报
回复
Create proc up_get
@Hour int
as
declare @date datetime
select @date=dateadd(hh,@Hour,0)
print @date
select isnull(cast(nullif(datediff(yy,0,@date),0) as varchar(10))+'年','')+
isnull(cast(nullif(datepart(mm,@date)-1,0) as varchar(10))+'月','')+
isnull(cast(nullif(datepart(dd,@date)-1,0) as varchar(10))+'日','')+
isnull(cast(nullif(datepart(hour,@date),0) as varchar(10))+'小时','')
GO

exec up_get 25
--1日1小时
exec up_get 125
--5日5小时
exec up_get 9600
--1年1月4日
exec up_get 9603
--1年1月4日3小时

jiujiang88 2009-06-03
  • 打赏
  • 举报
回复
三元表达式?貌似不会,编程语言倒行,友情UP.
楼上已经有答案,红尘还是那么strong.
子陌红尘 2009-06-03
  • 打赏
  • 举报
回复
还有点问题,修改一下:
declare @hour int
set @hour=10
select
(case when datepart(yy,yy)-1900=0 then '' else rtrim(datepart(yy,yy)-1900)+'年' end)+
(case when datepart(mm,yy)-1 =0 then '' else rtrim(datepart(mm,yy)-1) +'月' end)+
(case when datepart(dd,yy)-1 =0 then '' else rtrim(datepart(dd,yy)-1) +'天' end)+
(case when hh =0 then '' else rtrim(hh) +'小时' end)
from
(select (case when @hour/24>0 then cast(@hour/24-1 as datetime) else 0 end) as yy,@hour%24 as hh) t
/*
----------------------------------------------------------
10小时
*/

set @hour=100
select
(case when datepart(yy,yy)-1900=0 then '' else rtrim(datepart(yy,yy)-1900)+'年' end)+
(case when datepart(mm,yy)-1 =0 then '' else rtrim(datepart(mm,yy)-1) +'月' end)+
(case when datepart(dd,yy)-1 =0 then '' else rtrim(datepart(dd,yy)-1) +'天' end)+
(case when hh =0 then '' else rtrim(hh) +'小时' end)
from
(select (case when @hour/24>0 then cast(@hour/24-1 as datetime) else 0 end) as yy,@hour%24 as hh) t
/*
----------------------------------------------------------
3天4小时
*/

set @hour=1000
select
(case when datepart(yy,yy)-1900=0 then '' else rtrim(datepart(yy,yy)-1900)+'年' end)+
(case when datepart(mm,yy)-1 =0 then '' else rtrim(datepart(mm,yy)-1) +'月' end)+
(case when datepart(dd,yy)-1 =0 then '' else rtrim(datepart(dd,yy)-1) +'天' end)+
(case when hh =0 then '' else rtrim(hh) +'小时' end)
from
(select (case when @hour/24>0 then cast(@hour/24-1 as datetime) else 0 end) as yy,@hour%24 as hh) t
/*
----------------------------------------------------------
1月9天16小时
*/

set @hour=10000
select
(case when datepart(yy,yy)-1900=0 then '' else rtrim(datepart(yy,yy)-1900)+'年' end)+
(case when datepart(mm,yy)-1 =0 then '' else rtrim(datepart(mm,yy)-1) +'月' end)+
(case when datepart(dd,yy)-1 =0 then '' else rtrim(datepart(dd,yy)-1) +'天' end)+
(case when hh =0 then '' else rtrim(hh) +'小时' end)
from
(select (case when @hour/24>0 then cast(@hour/24-1 as datetime) else 0 end) as yy,@hour%24 as hh) t
/*

----------------------------------------------------------
1年1月19天16小时
*/
加载更多回复(6)

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧