关于oracle 函数last_day 再sql 中怎么应用

xiandairuidong 2010-10-28 09:50:12
--获取当前日期之后剩余天数
begin
declare @dates varchar
DECLARE @Result number(3)
if (len(@nowdate)>6)
begin
set @dates=@nowdate
end
else if (len(@nowdate)<=6)
begin
select convert(varchar(10),last_day(convert(varchar(10),@nowdate+'01',20),20) into @dates from dual
select (365- convert(varchar,cast(@dates as datetime),'DDD')) into @Result from dual
end
RETURN @dates
end

将这段oracle 语句转换成 sql 的 谢谢啦!
...全文
978 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dawugui 2010-10-28
--获取当前日期之后剩余天数

--如果是获取当前日期之后该月的剩余天数?
select datediff(dd,getdate(),cast(convert(varchar(7),dateadd(mm,1,getdate()),120) + '-01' as datetime) - 1)

/*

-----------
3

(所影响的行数为 1 行)
*/


--如果是获取当前日期之后该年的剩余天数?
select datediff(dd,getdate(),cast(year(getdate())+1 as varchar)+'-01-01')

/*

-----------
65

(所影响的行数为 1 行)

*/
回复
xiandairuidong 2010-10-28
我需要传参的传过来的参数位varchar类型比如:201010这样的时间参数
oracle完整代码:

create or replace function GetLeaveDays(nowdate in varchar2) return number is
Result number(3);

dates varchar2(10);
--获取当前日期之后剩余天数
begin
if length(nowdate)>6 then
dates := nowdate;
end if;
if length(nowdate)<=6 then
select to_char(last_day(to_date(nowdate||'01','yyyy-MM-dd')),'yyyy-MM-dd') into dates from dual;
end if;
select (365- to_char(to_date(dates,'yyyy-MM-dd'),'DDD')) into Result from dual;
return(Result);
end ;

将它转换成sql函数 各位朋友您们给的答案都不正确啊!谢谢啦
回复
dawugui 2010-10-28
oracle 函数last_day 获取当前月的最后一天

select cast(convert(varchar(7),dateadd(mm,1,getdate()),120) + '-01' as datetime) - 1

/*

------------------------------------------------------
2010-10-31 00:00:00.000

(所影响的行数为 1 行)

*/
回复
SQLCenter 2010-10-28
原代码貌似没有闰年判断
#1直接计算明天和明年1-1的日差
回复
王向飞 2010-10-28
select dateadd(dd,-1,dateadd(mm,1,dateadd(dd,-datepart(dd,getdate())+1,getdate())))
回复
SQLCenter 2010-10-28
select datediff(day, getdate()+1, ltrim((year(getdate())+1)))--64
回复
coleling 2010-10-28
好人做到底,帮你把整个函数翻译一下:

if object_id('GetLeaveDays','fn') is not null
drop function GetLeaveDays
go

create function GetLeaveDays(@nowdate varchar(10))
returns int
as
--获取当前日期之后剩余天数
begin
declare @dates datetime
if len(@nowdate)>6
set @dates = cast(@nowdate as datetime)
else
set @dates = dateadd(d,-1,dateadd(m,1,cast(@nowdate+'01' as datetime)))

return 365 - datepart(dayofyear,@dates)
end

select dbo.GetLeaveDays('201010'),dbo.GetLeaveDays('20101001')
/*
----------- -----------
61 91

(1 行受影响)
*/
回复
abuying 2010-10-28
--datepart(dayofyear,date)
declare @s varchar(10)
declare @mindate datetime
set @s='20101028' --2010-10-28这一天
set @mindate=cast(cast(left(@s,4)+'0101' as varchar(10)) as datetime)
select 剩余天数=datepart(dayofyear,dateadd(day,-1,dateadd(year,1,@mindate)))-datepart(dayofyear,convert(datetime,@s)),
当年最小日期=@mindate, 当年最大日期=dateadd(day,-1,dateadd(year,1,@mindate)),
当前已过天数=datepart(dayofyear,convert(datetime,@s)),
当年最大天数=datepart(dayofyear,dateadd(day,-1,dateadd(year,1,@mindate)))

剩余天数 当年最小日期 当年最大日期 当前已过天数 当年最大天数
----------- ----------------------- ----------------------- ----------- -----------
64 2010-01-01 00:00:00.000 2010-12-31 00:00:00.000 301 365

(1 行受影响)
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2010-10-28 09:50
社区公告
暂无公告