Я довольно новичок в 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))
Я знаю, что есть записи для этого конкретного клиента в обоих этих ведрах.
Предложения?
Две точки зрения: используйте привычку использовать DATEADD вместо арифметических значений 'DATE' и' DATETIME'. (И 'DATEDIFF', а остальные функции даты/времени.) Более четкие, более гибкие, .... При написании кода, который многократно использует 'GETDATE()', рассмотрите возможность сохранения значения и его использования в течение всего времени, то есть 'declare @Now как DateTime = GetDate();'. Хотя он рассматривается как константа в рамках одного запроса, т. Е. Все ваши вызовы возвращают одно и то же значение, когда у вас есть несколько операторов, значение может меняться, вызывая редкую, но значительную путаницу. – HABO
Плохая практика использования 'BETWEEN' с типами' datetime'. Получить привычку использовать 'date> = date_from AND date
Anon
В частности, если вы запустили свой запрос прямо сейчас, вы потеряете записи, где '[Due Date] = '2015-02-22'', потому что'' 2015-02-22 ' 'GETDATE() - 60'. Вы не записываете эти записи в течение [30 дней] или [60 дней] –
Anon