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

Откуда:
Сообщений: 206
Здравствуйте! Никак понять не могу, есть такой запрос:
SELECT DATEADD(day, (DATEDIFF (day, '19800104', date) / 7) * 7, '19800104') as 'Last Friday'
from Employee

Как я понимаю, что деля на семь получается количество недель, а вот *7 - что дает?
6 июл 13, 23:33    [14531991]     Ответить | Цитировать Сообщить модератору
 Re: Последняя пятница месяца  [new]
Yasha123
Member

Откуда:
Сообщений: 1955
boobonick,

это не последняя пятница месяца, а просто ближайшая прошедшая пятница,
т.е. для сегодня это:
SELECT DATEADD(day, (DATEDIFF (day, '19800104', GETDATE()) / 7) * 7,  '19800104') as 'Last Friday'
----------------------------
2013-07-05 00:00:00.000


а принцип такой:
нам надо в какой-то пятнице (в данном случае выбрана 1980-01-04 -- "базовая пятница")
прибавить максимально возможное число дней кратное 7,
такое, чтобы полученная дата не превзошла заданную дату
(т.к. прибавляя 7 к любой пятнице, попадаем снова на пятницу)
поэтому сначала находится разница DATEDIFF в днях от базовой пятницы до заданной даты,
а потом / 7 * 7 -- ближайшее кратное 7, не превосходящее это число дней.
прибавив это к базовой пятнице, получим ближайшую прошедшую пятницу
7 июл 13, 01:15    [14532143]     Ответить | Цитировать Сообщить модератору
 Re: Последняя пятница месяца  [new]
boobonick
Member [заблокирован]

Откуда:
Сообщений: 206
Благодарю! А не подскажете, как тогда найти последнюю пятницу месяца, с учетом года. Я знаю, что faq есть про последнее воскресение, но там не учитывается почему-то 31 декабря, ну или я не понимаю чего-то
7 июл 13, 11:55    [14532448]     Ответить | Цитировать Сообщить модератору
 Re: Последняя пятница месяца  [new]
boobonick
Member [заблокирован]

Откуда:
Сообщений: 206
convert(char(10),
DATEADD(DY,DATEDIFF(DY,'1900-01-05',DATEADD(MM,DATEDIFF(MM,0,date),30))/7*7,'1900-01-05'),126
)
7 июл 13, 13:16    [14532573]     Ответить | Цитировать Сообщить модератору
 Re: Последняя пятница месяца  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
boobonick
Благодарю! А не подскажете, как тогда найти последнюю пятницу месяца, с учетом года. Я знаю, что faq есть про последнее воскресение, но там не учитывается почему-то 31 декабря, ну или я не понимаю чего-то
Зачем неправду говорите?
Кто Вам мешает переменной @wd присвоить значение 5?
declare @d datetime=CURRENT_TIMESTAMP, @wd int=5;
select 
dateadd(day,
 (@wd-6-@@datefirst-datepart(weekday, dateadd(day,-1, dateadd(month,1, convert(char(6),@d,112)+'01'))))%7,
 dateadd(day,-1, dateadd(month,1, convert(char(6),@d,112)+'01')));
7 июл 13, 13:30    [14532597]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить