Скрипт для фильтрации по самой последней дате конца недели - PullRequest
0 голосов
/ 12 июня 2018

Отчетная неделя моей компании с понедельника по воскресенье.Утром в понедельник я запускаю несколько запросов, используя Microsoft SQL Server Management Studio, чтобы сообщить о деловой активности за предыдущую неделю.В настоящее время я использую заявления декларации, чтобы получить желаемый диапазон дат.Это работает довольно хорошо, пока я работаю с отчетами в понедельник.Однако, если понедельник был выходным, и я не запускаю отчеты до вторника, мне нужно вручную изменять диапазон дат для каждого запроса.Как я могу изменить свой фильтр дат для получения записей за предыдущее «воскресенье», чтобы не имело значения, в какой день я на самом деле запустил отчет.

Вот пример запроса;

Declare @DATEFROM SMALLDATETIME = (CONVERT(datetime, getdate() + cast('00:00' as datetime)) - 8), @DATETO smalldatetime = (CONVERT(datetime, getdate() + cast('23:59' as datetime))-2);

Create Table #SALES ([PartNumber] CHAR(5), [DateSold] SMALLDATETIME)

Insert Into #SALES   Select   '10190',  '6/3/2018 11:00'
Insert Into #SALES   Select   '10213',  '6/8/2018  8:00:00 AM'
Insert Into #SALES   Select   '10214',  '6/5/2018  9:30:00 AM'
Insert Into #SALES   Select   '10215',  '6/4/2018  1:00:00 PM'
Insert Into #SALES   Select   '10217',  '6/6/2018  1:00:00 PM'
Insert Into #SALES   Select   '10219',  '6/7/2018  12:00:00 PM'
Insert Into #SALES   Select   '10220',  '6/9/2018  3:30:00 PM'

Insert Into #SALES   Select   '10221',  '6/11/2018  8:30:00 AM'
Insert Into #SALES   Select   '10222',  '6/11/2018  2:30:00 PM'
Insert Into #SALES   Select   '10225',  '6/8/2018  8:00:00 AM'
Insert Into #SALES   Select   '10227',  '6/10/2018  9:00:00 AM'
Insert Into #SALES   Select   '10231',  '6/10/2018  1:00:00 PM'
Insert Into #SALES   Select   '10233',  '6/2/2018  8:00:00 AM';

SELECT S.PartNumber, S.DateSold 
FROM #SALES S 
WHERE DATESOLD BETWEEN @DATEFROM AND @DATETO 
ORDER BY DateSold;

DROP TABLE #SALES

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Во-первых, несколько интересующих элементов:

  • Команда SQL Server SET DATEFIRST позволяет выбрать любой день недели в качестве первого дня недели, начиная с 1 (понедельник).) до 7 (воскресенье).
  • Вы можете запросить текущее значение этого параметра с помощью выражения @@datefirst.
  • DATEPART(weekday, getdate()) вернет число длятекущий день недели, где 1 обозначает день, установленный SET DATEFIRST, 2 обозначает день после и т. д.

Итак, предположим, я хочу ответить на вопрос: за сколько дней до некоторой произвольной даты @TestDateбыл самый последний понедельник?Количество дней, прошедших с самого начала начала недели, составляет DATEPART(weekday, @TestDate) - 1, а количество дней, прошедших между понедельником и началом недели, @@datefirst - 1, поэтому количество дней, прошедших ссамый последний понедельник - сумма этих величин по модулю 7:

declare @TestDate date = convert(date, getdate());
declare @DaysPastMonday int = (@@datefirst + datepart(weekday, @TestDate) - 2) % 7;

С помощью этой информации вы можете очень легко получить диапазон дат:

declare @DateTo date = dateadd(day, -@DaysPastMonday, @TestDate);
declare @DateFrom date = dateadd(day, -7, @DateTo);

Но обратите внимание, что обе датыЯ выбрал здесь понедельники, а вы хотите с понедельника по воскресенье.Причина, по которой я сделал это таким образом, заключается в том, что если вы собираетесь просматривать поля, которые потенциально имеют компонент времени, а также дату (например, datetime или datetime2), и вы хотите использовать BETWEEN, то вам нужно убедиться, что в вашей дате окончания указано самое позднее время дня, которое SQL Server может представлять.Я считаю более понятным использование диапазона дат, включающего дату начала и исключающего дату окончания.Таким образом, вместо выражения вроде этого:

x BETWEEN @DateFrom AND @DateTo

Вы бы написали свои запросы, чтобы использовать выражение вроде этого:

x >= @DateFrom AND x < @DateTo
0 голосов
/ 12 июня 2018
Declare @DATEFROM datetime = DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0), 
@DATETO datetime = DATEADD(ms, -3, (select DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 7)));
...