2015-04-22 6 views
1

Я довольно новичок в T-SQL и все еще учась, поэтому, пожалуйста, несите меня на этом ... Я пробовал несколько способов сделать это без везения. У меня есть мои «текущие» и более 90 дней, но с 30 и 60 днями я боюсь. Почему я не могу использовать предложение «между»?Использование диапазона с GETDATE & BETWEEN

,[CURRENT]=(SELECT sum (cle.[Amount]) 
    FROM [NISNAV].[dbo].[NIS$Cust_ Ledger Entry] cl3 left outer join 
    [NISNAV].[dbo].[NIS$Detailed Cust_ Ledg_ Entry] cle on cl3.[entry no_]=cle.[cust_ ledger entry no_] 
    where C.[NO_]=CL3.[CUSTOMER NO_] AND cl3.[open]='1' AND cl3.[Due Date]>getdate()-30) 



    ,[30 DAYS]=(SELECT sum (cle.[Amount]) 
    FROM [NISNAV].[dbo].[NIS$Cust_ Ledger Entry] cl3 left outer join 
    [NISNAV].[dbo].[NIS$Detailed Cust_ Ledg_ Entry] cle on cl3.[entry no_]=cle.[cust_ ledger entry no_] 
    where C.[NO_]=CL3.[CUSTOMER NO_] AND cl3.[open]='1' AND cl3.[Due Date]BETWEEN GETDATE()-31 AND getdate()-59) 

    ,[60 DAYS]=(SELECT sum (cle.[Amount]) 
    FROM [NISNAV].[dbo].[NIS$Cust_ Ledger Entry] cl3 left outer join 
    [NISNAV].[dbo].[NIS$Detailed Cust_ Ledg_ Entry] cle on cl3.[entry no_]=cle.[cust_ ledger entry no_] 
    where C.[NO_]=CL3.[CUSTOMER NO_] AND cl3.[open]='1' AND cl3.[Due Date] BETWEEN GETDATE()-60 AND getdate()-89) 

     ,[90 + DAYS]=((SELECT sum (cle.[Amount]) 
    FROM [NISNAV].[dbo].[NIS$Cust_ Ledger Entry] cl3 left outer join 
    [NISNAV].[dbo].[NIS$Detailed Cust_ Ledg_ Entry] cle on cl3.[entry no_]=cle.[cust_ ledger entry no_] 
    where C.[NO_]=CL3.[CUSTOMER NO_] AND cl3.[open]='1' AND cl3.[Due Date]<=getdate()-90)) 

Я знаю, что есть записи для этого конкретного клиента в обоих этих ведрах.

Предложения?

+1

Две точки зрения: используйте привычку использовать DATEADD вместо арифметических значений 'DATE' и' DATETIME'. (И 'DATEDIFF', а остальные функции даты/времени.) Более четкие, более гибкие, .... При написании кода, который многократно использует 'GETDATE()', рассмотрите возможность сохранения значения и его использования в течение всего времени, то есть 'declare @Now как DateTime = GetDate();'. Хотя он рассматривается как константа в рамках одного запроса, т. Е. Все ваши вызовы возвращают одно и то же значение, когда у вас есть несколько операторов, значение может меняться, вызывая редкую, но значительную путаницу. – HABO

+0

Плохая практика использования 'BETWEEN' с типами' datetime'. Получить привычку использовать 'date> = date_from AND date Anon

+0

В частности, если вы запустили свой запрос прямо сейчас, вы потеряете записи, где '[Due Date] = '2015-02-22'', потому что'' 2015-02-22 ' 'GETDATE() - 60'. Вы не записываете эти записи в течение [30 дней] или [60 дней] – Anon

ответ

1

При фильтрации ряда дат BETWEEN ожидает, что более ранняя дата должна быть представлена ​​до более поздней даты.

Вам необходимо поменять местами стороны межгрупповых, так что старше дата (с самой высокой -Value) приходит первым:

,[30 DAYS]=(SELECT sum (cle.[Amount]) 
    FROM [NISNAV].[dbo].[NIS$Cust_ Ledger Entry] cl3 left outer join 
    [NISNAV].[dbo].[NIS$Detailed Cust_ Ledg_ Entry] cle on cl3.[entry no_]=cle.[cust_ ledger entry no_] 
    where C.[NO_]=CL3.[CUSTOMER NO_] AND cl3.[open]='1' AND cl3.[Due Date]BETWEEN GETDATE()-59 AND getdate()-31) 

    ,[60 DAYS]=(SELECT sum (cle.[Amount]) 
    FROM [NISNAV].[dbo].[NIS$Cust_ Ledger Entry] cl3 left outer join 
    [NISNAV].[dbo].[NIS$Detailed Cust_ Ledg_ Entry] cle on cl3.[entry no_]=cle.[cust_ ledger entry no_] 
    where C.[NO_]=CL3.[CUSTOMER NO_] AND cl3.[open]='1' AND cl3.[Due Date] BETWEEN GETDATE()-89 AND getdate()-60) 
+0

СПАСИБО !!! так просто!!! – mbrewer

0

вместо четырех отдельных подзапросов, вы можете использовать один запрос с CASE заявления

SELECT 
    [CURRENT] = SUM(CASE WHEN cl3.[Due Date] >= DATEADD(day,-30,GETDATE()) 
         THEN cle.[Amount] 
        END) 
,[30 DAYS] = SUM(CASE WHEN cl3.[Due Date] < DATEADD(day,-30,GETDATE()) 
         AND cl3.[Due Date] >= DATEADD(day,-60,GETDATE()) 
         THEN cle.[Amount] 
        END) 
,[60 DAYS] = SUM(CASE WHEN cl3.[Due Date] < DATEADD(day,-60,GETDATE()) 
         AND cl3.[Due Date] >= DATEADD(day,-90,GETDATE()) 
         THEN cle.[Amount] 
        END) 
,[90 DAYS] = SUM(CASE WHEN cl3.[Due Date] < DATEADD(day,-90,GETDATE()) 
         THEN cle.[Amount] 
        END) 
FROM [NISNAV].[dbo].[NIS$Cust_ Ledger Entry] cl3 
LEFT OUTER JOIN [NISNAV].[dbo].[NIS$Detailed Cust_ Ledg_ Entry] cle 
    ON(cl3.[entry no_]=cle.[cust_ ledger entry no_]) 
WHERE C.[NO_]=CL3.[CUSTOMER NO_] 
    AND cl3.[open]='1' 
Смежные вопросы