首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

关于生日倒计时字段有关问题

2013-12-19 
关于生日倒计时字段问题?1.我的目的是做一个生日倒计时。2.SQL数据表[A]中的数据如下:ID  XM  SR1小李 1983

关于生日倒计时字段问题?
1.我的目的是做一个生日倒计时。
2.SQL数据表[A]中的数据如下:


ID  XM    SR
1    小李 1983-12-5
2    小王 1997-12-29

3.第一种思路,我想写一条SQL语句达到下面的效果!就是把生日的年份转成当前年份。

ID  XM(姓名)    SR(生日)     ZHHDRQ(转换后的日期)  
1     小李     1983-12-5      2013-12-5         
2     小王     1997-12-29     2013-12-29          


4.我的表最终效果应该是这样的。

ID  XM(姓名)    SR(生日)     ZHHDRQ(转换后的日期)  DJS
1     小李     1983-12-5      2013-12-5         datediff(d,zhhdrq,getdate())
2     小王     1997-12-29     2013-12-29         datediff(d,zhhdrq,getdate())


5.第二种思路想用如下这条语句:
alter table A add DJS as datediff(D,getdate(),year(getdate())+'-'+month(SR)+'-'+day(SR))

去得到如下表,当然,结果肯定是错的,请大神们看看哪一种思路是对的,我应该怎么做?(当前日期是2013-12-18)

ID  XM(姓名)    SR(生日)       DJS
1     小李     1983-12-5     -13
2     小王     1997-12-29     11




[解决办法]
/*
6、编写一个函数func_calcdays,计算下一个生日还有多少天,函数
   带两个输入参数(生日和当前日期),一个返回值(天数)。
*/
go
if object_id('func_calcdays')is not null
drop function func_calcdays
go
create function func_calcdays( 
       @birthday as datetime , @currentdate as datetime ) 
returns int 
as 
begin 
declare @currentage int,@nextbirthday datetime,@days int
if month(@currentdate)>month(@birthday)
--当前月份大于生日所在月份,表示生日已经过了
begin
select @currentage=datediff(yy,@birthday,@currentdate)
select @nextbirthday=dateadd(yy,(@currentage+1),@birthday)
select @days=datediff(dd,@currentdate,@nextbirthday)
end
else 
if month(@currentdate)<month(@birthday)
--当前月份小于生日所在月份,生日还没过,生一个生日是去年
begin
select @currentage=datediff(yy,@birthday,@currentdate)
select @nextbirthday=dateadd(yy,@currentage,@birthday)
select @days=datediff(dd,@currentdate,@nextbirthday)
end
else 
--当前月份等于生日所在月份
if day(@birthday)>day(@currentdate)--生日日期大于当前日期,生日还没过,且就在当前这一个月
begin
select @days=day(@birthday)-day(@currentdate)
end 
else--生日日期小于当前日期,生日已经过了,且就在当前这一个月
begin
select @currentage=datediff(yy,@birthday,@currentdate)
select @nextbirthday=dateadd(yy,(@currentage+1),@birthday)
select @days=datediff(dd,@currentdate,@nextbirthday)
end
return @days
end

--调用函数
select dbo . func_calcdays ( '1990-11-23' , getdate ())

/*
6、编写一个函数func_calcdays,计算下一个生日还有多少天,函数
   带两个输入参数(生日和当前日期),一个返回值(天数)。
*/

create function func_calcdays(@birth datetime,@curr datetime)
returns int
as
begin
declare @nextbirth datetime,@days int
if(month(@curr)>month(@birth))--生日已过
begin
select @nextbirth=dateadd(year,datediff(year,@birth,@curr)+1,@birth);
select @days= datediff(day,@curr,@nextbirth);
end
else if(month(@curr)=month(@birth))
 begin
  if(day(@curr)>day(@birth))--生日已过
   begin
     select @nextbirth=dateadd(year,datediff(year,@birth,@curr)+1,@birth);
     select @days= datediff(day,@curr,@nextbirth);
   end
  else   --生日未过
   begin
     select @nextbirth=dateadd(year,datediff(year,@birth,@curr),@birth);
     select @days= datediff(day,@curr,@nextbirth);
   end
 end
else  --生日未过
  begin
     select @nextbirth=dateadd(year,datediff(year,@birth,@curr),@birth);
     select @days= datediff(day,@curr,@nextbirth);
   end
return @days
end



select dbo.func_calcdays('1980-12-15',getdate())


--建立存储过程实现:
go
if object_id('pro_calcdays')is not null
drop proc pro_calcdays
go
create proc pro_calcdays @birthday datetime,@days int output


as
select @days=
       case  
       when 
           month(@birthday)<month(getdate())
       then 
          datediff(dd,getdate(),dateadd(yy,(year(getdate())-year(@birthday)+1),@birthday))  
       --case
       when 
           month(@birthday)>month(getdate()) 
       then
          datediff(dd,getdate(),dateadd(yy,(year(@birthday)-year(getdate())),@birthday))
       --case
       when
           month(@birthday)=month(getdate()) and day(@birthday)>day(getdate())
       then         
           day(@birthday)-day(getdate())
       else
           datediff(dd,getdate(),dateadd(yy,(year(getdate())-year(@birthday)+1),@birthday))  
       end

declare @days int
exec pro_calcdays '1990-12-19',@days output
select @days as day


[解决办法]
可以截取月份datediff(mm,'xxxx','xxxx')和日期datediff(dd,'xxxx','xxxx')都相等也可以!关于生日倒计时字段有关问题
[解决办法]
CREATE TABLE TT(ID INT ,XM VARCHAR(10),SR DATETIME)
go

insert INTO TT(id,xm,sr)
SELECT 1,'小李','1983-12-5'
UNION ALL
SELECT 2,'小王','1997-12-29'

SELECT  * ,
        DATEDIFF(DD, GETDATE(),
                 CONVERT(VARCHAR, YEAR(GETDATE())) + '-'
                 + RIGHT(CONVERT(VARCHAR(10), sr, 120), 5)) AS dd
FROM    dbo.TT

/*
IDXMSRdd
1小李1983-12-05 00:00:00.000-13
2小王1997-12-29 00:00:00.00011*/

[解决办法]
1楼想得太复杂了吧,提供思路,将当前时间t1和当前年生日的时间t2进行比较,如果小于等于,则取t1和t2的时间差;如果大于,则取下一年的生日的时间t3,取t1和t3的时间差。
[解决办法]
  
SELECT  * ,
        DATEDIFF(DD, GETDATE(),
                 CONVERT(VARCHAR, YEAR(GETDATE())) + '-'
                 + RIGHT(CONVERT(VARCHAR(10), sr, 120), 5)) AS dd
FROM    dbo.TT
  3楼的 简介明了

热点排行