Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос, даты по группам  [new]
Narimunt
Member

Откуда:
Сообщений: 13
Стоит задача написать запрос, который бы разбил даты по неделям - от пятницы - первый день, до четверга - последний и выдал какой последний день этой недели. Например, если дата 2017-01-01 <= 2017-01-05, возвращает 2017-01-05, если 2017-01-06 <= 2017-01-12 то возвращает 2017-01-12 и т.д. Подскажите каким образом это можно сделать? Пробовал с dateadd i datepart и так и сяк :) В итоге никак...
4 апр 17, 14:19    [20365381]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, даты по группам  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
Narimunt,
SET DATEFIRST 1
SELECT DATEPART( WEEKDAY, '20170101' )
;
SET DATEFIRST 5
SELECT DATEPART( WEEKDAY, '20170101' )
;
4 апр 17, 14:36    [20365458]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, даты по группам  [new]
Narimunt
Member

Откуда:
Сообщений: 13
Руслан Дамирович,
Спасибо! Подтолкнули на мысль...Не знаю на сколько это корректно, паралельно другие операции проводятся с датами, может ничего не испортит.

В итоге, сделал так.
SET DATEFIRST 5;
dateadd(ww, 1, dateadd(dd, -datepart(dw, @Invoicedate), @Invoicedate)) 
4 апр 17, 14:56    [20365534]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, даты по группам  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
DECLARE @D DATE='20170106', @w tinyint=5 /*пятница*/;
SELECT DATEADD(DAY,@w-1,DATEDIFF(DAY,@w-1,@D)/7*7+6);
4 апр 17, 14:57    [20365544]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, даты по группам  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Narimunt
Руслан Дамирович,
Спасибо! Подтолкнули на мысль...Не знаю на сколько это корректно, паралельно другие операции проводятся с датами, может ничего не испортит.

В итоге, сделал так.
SET DATEFIRST 5;
dateadd(ww, 1, dateadd(dd, -datepart(dw, @Invoicedate), @Invoicedate)) 
SET крайне нежелательно. Например, сделайте из этого представление. Или функцию.
Что, не получается? :))
4 апр 17, 14:59    [20365549]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, даты по группам  [new]
Narimunt
Member

Откуда:
Сообщений: 13
iap,
Спасибо, тоже рабочий вариант! Лучше чем c datefirst, не нравится он мне :)
4 апр 17, 15:18    [20365645]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, даты по группам  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
iap
DECLARE @D DATE='20170106', @w tinyint=5 /*пятница*/;
SELECT DATEADD(DAY,@w-1,DATEDIFF(DAY,@w-1,@D)/7*7+6);

М - Магия!
4 апр 17, 15:47    [20365803]     Ответить | Цитировать Сообщить модератору
 Re: Запрос, даты по группам  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
iap
SET крайне нежелательно. Например, сделайте из этого представление. Или функцию.
Что, не получается? :))

SETонезависимая магия. Я не знаю, как оно работает:
SET DATEFIRST 3
;
DECLARE @D DATE = '20170106'
DECLARE @W SMALLINT = 7
DECLARE @WDAY SMALLINT = 1 + ( ( @@DATEFIRST + 6 - @W ) + DATEPART( WEEKDAY, @D ) ) % 7
DECLARE @WBEG DATE = DATEADD( DAY, 1 - @WDAY, @D )
DECLARE @WEND DATE = DATEADD( DAY, 7 - @WDAY, @D )
;
SELECT
  [date] = @D,
  [wd] = @WDAY,
  [wb] = @WBEG,
  [we] = @WEND
4 апр 17, 18:29    [20366485]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить