表A(自定义日历表)
[id] [int] NOT NULL ,
[F_ID] [int] NOT NULL ,
[IDType] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[WeekEndType] [int] NULL ,--周末假日类型(位)1=周六上午上班 2=周六下午上班4=周日上午上班 8=周日上午上班
[WDayHours] [decimal](18, 1) NULL ,
[WDayADD] [decimal](18, 1) NULL ,
表B(明细表)
[ID] [int] NOT NULL ,
[FY_ID] [int] NOT NULL ,
[DDate] [datetime] NULL ,
[Dtype] [int] NULL ,--假日类型:1=该日期为假日,-1=该日期为工作日(便如黄金周,原来可能是周日的,但公司作了调整为------------上班天)如果是-1,会强制周末为工作日
[DDesc] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL
问题:
写一个自定义函数计算两个日期差:
本人已经写好了除周六日的(但如果考虑用户自定义假日表的应该如何处理。)
现在已经完成功能(周六算0.5天,周日算1天)
--这个函数只是计算当前日期为周的第几天(没太大的意义)
Create Function FuncDATE_GetWeekDay(@pDate DateTime )
returns Int
AS
BEGIN
Declare @RTN Int
Declare @WKD Int
Set @WKD=DatePart(W,@pDate)
if(@WKD=1)
Set @RTN=7
else
Set @RTN=@WKD-1
Return @RTN
END
--算日期差的函数
--@pram2 结束时间
--@pram1 开始时间
--@FID 表AID
FUNCTION [dbo].[Func_GetDaysOfGongRi](@pram1 varchar(15),@pram2 varchar(15),@FID Int)
RETURNS decimal(5, 1) AS
BEGIN
DECLARE @diffdate INT
DECLARE @sn INT
DECLARE @i INT
DECLARE @ii INT
DECLARE @RTN decimal(18,1) SET @diffdate=DATEDIFF(D,@pram1,@pram2)+1
SET @sn=[dbo].[Func_GetDateOfweek](@pram1)
SET @i=convert(int,(@diffdate)%7)
SET @ii=convert(int,@diffdate/7)
IF(@i=0)
BEGIN
SET @RTN=5.5*@ii
END
ELSE
BEGIN
SET @pram1=DATEADD(DAY,@ii*7,@pram1)
SET @RTN=5.5*@ii
WHILE(DATEDIFF(D,@pram1,@pram2)>=0)
BEGIN
IF([dbo].[Func_GetDateOfweek](@pram1)=7)
BEGIN
SET @RTN=@RTN
END
ELSE IF([dbo].[Func_GetDateOfweek](@pram1)=6)
BEGIN
SET @RTN=@RTN+0.5
END
ELSE
BEGIN
SET @RTN=@RTN+1
END
SET @pram1=DATEADD(DAY,1,@pram1)
END
END
RETURN @RTN
END问:应该如扣除表A,表B 里定义的日期,算出两日期差。谢谢!
[id] [int] NOT NULL ,
[F_ID] [int] NOT NULL ,
[IDType] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[WeekEndType] [int] NULL ,--周末假日类型(位)1=周六上午上班 2=周六下午上班4=周日上午上班 8=周日上午上班
[WDayHours] [decimal](18, 1) NULL ,
[WDayADD] [decimal](18, 1) NULL ,
表B(明细表)
[ID] [int] NOT NULL ,
[FY_ID] [int] NOT NULL ,
[DDate] [datetime] NULL ,
[Dtype] [int] NULL ,--假日类型:1=该日期为假日,-1=该日期为工作日(便如黄金周,原来可能是周日的,但公司作了调整为------------上班天)如果是-1,会强制周末为工作日
[DDesc] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL
问题:
写一个自定义函数计算两个日期差:
本人已经写好了除周六日的(但如果考虑用户自定义假日表的应该如何处理。)
现在已经完成功能(周六算0.5天,周日算1天)
--这个函数只是计算当前日期为周的第几天(没太大的意义)
Create Function FuncDATE_GetWeekDay(@pDate DateTime )
returns Int
AS
BEGIN
Declare @RTN Int
Declare @WKD Int
Set @WKD=DatePart(W,@pDate)
if(@WKD=1)
Set @RTN=7
else
Set @RTN=@WKD-1
Return @RTN
END
--算日期差的函数
--@pram2 结束时间
--@pram1 开始时间
--@FID 表AID
FUNCTION [dbo].[Func_GetDaysOfGongRi](@pram1 varchar(15),@pram2 varchar(15),@FID Int)
RETURNS decimal(5, 1) AS
BEGIN
DECLARE @diffdate INT
DECLARE @sn INT
DECLARE @i INT
DECLARE @ii INT
DECLARE @RTN decimal(18,1) SET @diffdate=DATEDIFF(D,@pram1,@pram2)+1
SET @sn=[dbo].[Func_GetDateOfweek](@pram1)
SET @i=convert(int,(@diffdate)%7)
SET @ii=convert(int,@diffdate/7)
IF(@i=0)
BEGIN
SET @RTN=5.5*@ii
END
ELSE
BEGIN
SET @pram1=DATEADD(DAY,@ii*7,@pram1)
SET @RTN=5.5*@ii
WHILE(DATEDIFF(D,@pram1,@pram2)>=0)
BEGIN
IF([dbo].[Func_GetDateOfweek](@pram1)=7)
BEGIN
SET @RTN=@RTN
END
ELSE IF([dbo].[Func_GetDateOfweek](@pram1)=6)
BEGIN
SET @RTN=@RTN+0.5
END
ELSE
BEGIN
SET @RTN=@RTN+1
END
SET @pram1=DATEADD(DAY,1,@pram1)
END
END
RETURN @RTN
END问:应该如扣除表A,表B 里定义的日期,算出两日期差。谢谢!
解决方案 »
- WIN7 安装ORACLE 11g R 2 CLIENT端以后使用SQLPLUS问题
- 这个SQl语句有点难写,不会写~~呵呵,选择问题
- 小弟使用oracle9i,不知道如何在帮助中查找和检索需要的资料,请各位指点。
- 请问如何把大数据量,快速地导出到一个文本文件里。在线等
- 急啊!!新手误删了oracle数据库里面的数据,数据都不见了,怎么才能恢复呀??
- fact table 和dimension table有什么区别,
- 如何迁移索引
- 非常简单的问题---在线等待
- 请问如何在ORACLE 存储过程中设置回滚断点?
- insert into select的优化
- Oracle 的全文检索时间长了,全文检索的索引表就越来越大了,请问如何整理
- 急!备份控制文件脚本问题
但是原理应该是一样的吧