Использование IF в функции SQL с таблицей 2 - PullRequest
0 голосов
/ 17 марта 2011

У меня есть такая страница

Ödeme

Баш Тар.-> Start Date Бит.Tar -> 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?Какой?

1 Ответ

2 голосов
/ 17 марта 2011

Если @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',
......
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...