使用标量函数的返回值来计算新结果

时间:2014-03-31 12:49:32

标签: sql-server

对于时间计算表,我编写了两个标量函数来检索返回值。

USE [SECI]
GO
/****** Object:  UserDefinedFunction [dbo].[sfCIKorr]    Script Date: 31.03.2014 14:14:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
ALTER FUNCTION [dbo].[sfCIKorr] 
(   
    -- Add the parameters for the function here
    @dteCheckInTime datetime, 
    @dtePlanTimeCheckIn datetime

)

RETURNS datetime
as
 BEGIN
Declare @dteCIKorr datetime

    --CheckInTime correction
    If @dteCheckInTime > 0 And @dtePlanTimeCheckIn > 0
        Begin
        set @dteCIKorr = @dtePlanTimeCheckIn
        end
    else If @dteCheckInTime < @dtePlanTimeCheckIn
        begin
        set @dteCIKorr = @dtePlanTimeCheckIn
        end       
    Else If (@dteCheckInTime > @dtePlanTimeCheckIn) And (@dteCheckInTime < DateAdd(minute, 15, @dtePlanTimeCheckIn))
        begin
        set  @dteCIKorr = @dtePlanTimeCheckIn
        end
    Else If @dteCheckInTime > DateAdd(minute, 15, @dtePlanTimeCheckIn)
        begin
        set  @dteCIKorr = dbo.sfRoundToHourParts(@dteCheckInTime, 4)
        End
    Else If @dteCheckInTime > 0 And @dtePlanTimeCheckIn = 0
        begin
        set @dteCIKorr = dbo.sfRoundToHourParts(@dteCheckInTime, 4)
        end
    Else If @dteCheckInTime = 0
        begin
        set @dteCIKorr = 0
        End

    return @dteCIKorr
end 

第二个: dbo.sfRoundToHourParts(合并(CheckOutTime,&#39;&#39;),4)向上或向下舍入到四分之一小时。

两者都可以正常工作,但现在我想在Update-query中使用结果来检索另一个应该是这样的结果:

来自VBA代码:

If dteCheckInTime > 0 And dteCheckOutTime > 0 Then
        dteCalculatedTime = Format(DateDiff("n", dteCIKorr, dteCOKorr) / 1440, "hh:nn")
    Else
        dteCalculatedTime = 0
    End If

所以最后的结果我想这样做:

Update mytable
set CheckInTimeCorr= dbo.sfCIKorr(@dteCheckInTime, @dtePlanTimeCheckIn),
CheckOutTimeCorr=dbo.sfRoundToHourParts(coalesce(CheckOutTime,''), 4),
CalculatedTime=  see my VBA-Code!
Select from mytable

所以我需要两个函数来检索结果,我需要对进一步的步骤进行计算。 顺便说一句,我不知道,如果使用两个标量函数真的需要完成我的查询,或者我可以更好地在内联表函数中执行此操作。

谢谢你的帮助。 迈克尔

1 个答案:

答案 0 :(得分:0)

如果CalculatedTime列始终依赖于CheckInTimeCorr和CheckOutTimeCorr中的值,我将其创建为计算列(http://technet.microsoft.com/en-us/library/ms188300.aspx):

ALTER TABLE tbl ADD CalculatedTime AS (--your code here--)

我想帮助您了解该列的实际定义,但无法读取VBA :(