Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
boobonick Member [заблокирован] Откуда: Сообщений: 206 |
Здравствуйте! Никак понять не могу, есть такой запрос: SELECT DATEADD(day, (DATEDIFF (day, '19800104', date) / 7) * 7, '19800104') as 'Last Friday' from Employee Как я понимаю, что деля на семь получается количество недель, а вот *7 - что дает? |
6 июл 13, 23:33 [14531991] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
boobonick Member [заблокирован] Откуда: Сообщений: 206 |
Благодарю! А не подскажете, как тогда найти последнюю пятницу месяца, с учетом года. Я знаю, что faq есть про последнее воскресение, но там не учитывается почему-то 31 декабря, ну или я не понимаю чего-то |
7 июл 13, 11:55 [14532448] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
Кто Вам мешает переменной @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 | ![]() |