2011-03-16 25 views
0

我有這樣在SQL功能使用IF 2表

Ödeme

BAS焦油的頁面。 - >Start Date 位。焦油 - >End Date

我有一個SQL這樣這個頁面,

SELECT B.HESAP_NO, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2 AS 'TEKLIF',B.MUS_K_ISIM, 
dbo.fngcodeme(B.HESAP_NO, B.DOVIZ_KOD, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2,'01/01/2011', '11/03/2011') AS 'YATAN', 
(CASE WHEN B.DOVIZ_KOD = 21 THEN 'EUR' WHEN B.DOVIZ_KOD = 2 THEN 'USD' WHEN B.DOVIZ_KOD = 1 THEN 'TL' END) AS 'KUR', 
D.AVUKAT, 
(CASE WHEN D.HESAP IN (SELECT T_HESAP_NO FROM TAKIP) THEN 
(SELECT CONVERT(VARCHAR(10),ICRA_TAR,103) FROM TAKIP WHERE T_HESAP_NO = D.HESAP) 
ELSE ' ' END) AS 'ICRA TARİHİ', 
(CASE WHEN D.HESAP IN (SELECT T_HESAP_NO FROM TAKIP) THEN 
(SELECT CONVERT(VARCHAR(10),HACIZ_TAR,103) FROM TAKIP WHERE T_HESAP_NO = D.HESAP) 
ELSE '' END) AS 'HACİZ TARİHİ' 
FROM YAZ..MARDATA.S_TEKLIF B, AVUKAT D 
WHERE B.HESAP_NO = D.HESAP 
AND B.KAPANIS_TAR IS NULL 
AND ISNULL(dbo.fngcodeme(B.HESAP_NO, B.DOVIZ_KOD, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2,'01/01/2011', '11/03/2011'),0) > 0 
GROUP BY B.HESAP_NO, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2,B.DOVIZ_KOD ,B.MUS_K_ISIM, D.AVUKAT, D.HESAP 

,這是我dbo.fngcodeme功能,

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

AS 
BEGIN 

DECLARE @Result FLOAT 

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 

我想是

IF `Bit. Tar. (End Date)` is less or equal then 28/02/2011 --> Use M_HAREKET(table) 
IF Baş. Tar. (Start Date) is great or equal then 01/03/2011 --> Use M_GHAREKET(table) 

我該怎麼做?

我應該改變SQL還是Function?哪一個?

+0

你有兩個條件不是免費的。如果結束日期> 28/2並且開始日期<28/2,該怎麼辦?你的2件不包括它 – RichardTheKiwi 2011-03-16 22:20:46

+0

@理查德這沒關係這個網頁。 「用戶」將僅輸入..... - 2011年2月28日或2011年3月1日 - 日期範圍。 – 2011-03-17 06:09:15

回答

2

如果@BAS和@BIT是日期,請將它們作爲日期傳遞。不要使用VARCHAR。

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 

至於調用函數,不要使用區域特定的日期格式。堅持YYYYMMDD或ISO/XML之一。所以你的查詢將是

SELECT B.HESAP_NO, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2 AS 'TEKLIF',B.MUS_K_ISIM, 
dbo.fngcodeme(B.HESAP_NO, B.DOVIZ_KOD, B.TEKLIF_NO1 + '/' + B.TEKLIF_NO2,'20110101', '20110311') AS 'YATAN', 
...... 
+0

謝謝!但在我的SQL我有這樣的錯誤「varchar數據類型轉換爲日期時間數據類型導致超出範圍的值。」 – 2011-03-17 07:01:32

+1

@Soner - 答案已更新 – RichardTheKiwi 2011-03-17 07:04:41

+0

在我的aspx頁面中,我有這個SQL http://www.heypasteit.com/clip/UWL,但我再次遇到這個錯誤「將varchar數據類型轉換爲datetime數據類型在一個超出範圍的值。「 – 2011-03-17 07:30:18