在SQL函数中使用Date.Now

时间:2011-03-17 09:08:40

标签: asp.net sql sql-server function

我有Function这样的人;

ALTER FUNCTION [dbo].[fngcodeme]
(
    @HESAP INT, @DOV INT, @TEKLIF VARCHAR(10), @BAS datetime, @BIT datetime
)
RETURNS FLOAT

AS
BEGIN

DECLARE @Result FLOAT

IF CONVERT(DATETIME, @BIT,103) <= '20110228'
    SET @Result = (SELECT SUM(TUTAR)
        FROM YAZ..MARDATA.M_HAREKET
        WHERE TEMEL_HESAP = @HESAP
        AND DOVIZ_KOD = @DOV
        AND REF_KOD = 'GC'
        AND BACAK_GRUP = 'PERT'
        AND ISL_KOD = 1
        AND ACIKLAMA LIKE '%' + @TEKLIF + '%'
        AND ISL_TAR >= CONVERT(DATETIME, @BAS,103)
        AND ISL_TAR <= CONVERT(DATETIME, @BIT,103)
        )
ELSE
    SET @Result = (SELECT SUM(TUTAR)
        FROM YAZ..MARDATA.M_GHAREKET
        WHERE TEMEL_HESAP = @HESAP
        AND DOVIZ_KOD = @DOV
        AND REF_KOD = 'GC'
        AND BACAK_GRUP = 'PERT'
        AND ISL_KOD = 1
        AND ACIKLAMA LIKE '%' + @TEKLIF + '%'
        AND ISL_TAR >= CONVERT(DATETIME, @BAS,103)
        AND ISL_TAR <= CONVERT(DATETIME, @BIT,103)
        )

RETURN @Result

END

M_GHAREKET表是我的月度数据表。每月结束时,此表格加载到M_HAREKET。 (并删除了M_GHAREKET

中的所有数据

M_HAREKET是一个大问题。 M_GHAREKET很小。 (我的意思是M_HAREKET现在有超过500.000个数据,M_GHAREKET超过4.000)

我想要的是这个Function,如果@BAS日期的月份值等于DateTime.Now.Month值我想要使用M_GHAREKET表,否则使用M_HAREKET表。

我应该如何更改此功能?

是否可能像DateTime.Now.Month中的SQL Function这个IF子句?

或者我应该在我的ASP.NET页面中使用?我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

您可以使用monthyear

declare @BAS datetime
set @BAS = '2011-03-15'

if month(getdate()) = month(@BAS) and
   year(getdate()) = year(@BAS)

答案 1 :(得分:1)

您可以使用DATEDIFF查找两个月份之间的差异。这将返回超过的时间段边界数,因此在检查月份时,如果两个日期位于同一日历年和月中,则仅返回0

DECLARE @date1 DATETIME
SET @date1 = '2011-03-01'

SELECT DATEDIFF(MM, @date1, '2011-02-28') -- -1
SELECT DATEDIFF(MM, @date1, '2011-03-20') -- 0
SELECT DATEDIFF(MM, @date1, '2010-03-01') -- -12

因此,要检查日期是否与今天(GETDATE())相同,可以使用

DECLARE @date1 DATETIME
SET @date1 = '2011-03-01'

IF DATEDIFF(MM, @date1, GETDATE()) = 0
  BEGIN
    -- Do your work
  END