2014-02-10 16 views
6

У меня есть таблица с кучей дат (точнее, сроки погашения, если быть точным). Мне нужно запросить эту базу данных, чтобы найти последний день определенной недели, который хранится в таблице.Поиск последнего дня недели

Все, что мне будет предложено запросить в этой таблице, это год, месяц и конкретная неделя. И на основании этого мне нужно найти дату, которая хранится в таблице, которая соответствует этому.

Я создал следующий запрос, чтобы найти эту конкретную дату 28 марта 2013

SELECT M_SETNAME, M_LABEL, M_MAT FROM OM_MAT_DBF 
WHERE M_SETNAME = 'IMM_OSET ' 
AND MONTH(M_MAT) = 3 
AND YEAR(M_MAT) = 2013 
AND ((DATEPART(day,M_MAT)-1)/7 + 1) = 5 

ли вы, ребята, есть какие-либо идеи о том, как я могу изменить последнее условие так, что 28 марта будет рассмотрен пятой неделе месяца, а не 4-й недели, как это делается в настоящее время.

+0

Хммм, 28 марта - * четвертая * неделя месяца (первая неделя, 1-7, вторая, 8-14, третья, 15-21, четвертая 22-28). Какова ваша логика для подсчета недель в месяц? –

+0

Моя логика рассматривает последний день недели как неделю. Итак, 1 марта выпадает на пятницу, поэтому мой запрос даст мне 1 марта 2013 года, когда я установил последнее условие на 1. Таким образом, в основном 1 марта - 1-я неделя 8 марта - 2-я неделя 15 марта - 3-я неделя Март 22 - 4-я неделя 28 марта - 5-я неделя (не 29 б/с, а таблица только 28 марта, а на той неделе, а не 29 марта) – user3284817

+0

Как вы рассчитываете месяц, где первый день субботы? (В эту первую неделю нет пятницы!) Также, что такое «последний день недели» ... некоторые календари начинаются в воскресенье (Sun-Sat), а другие начинаются в понедельник (Mon-Sun). – Whitzz

ответ

1

Вы также можете использовать DATEPART, чтобы получить номер недели (в году), но затем вы также можете получить 1-е число каждого месяца и взять неделю, чтобы вы могли: НЕДЕЛЯ МОЙ ДАТЫ - НЕДЕЛЯ в ПЕРВЫЙ ДЕНЬ в этом месяце + 1.

Вот вам пример ...

DECLARE @Dt datetime 

SELECT @Dt='03-28-2013' 

SELECT DATEPART(wk, @Dt) - DATEPART(wk, Convert(Date,Convert(varchar(4),YEAR(@Dt)) 
+ '-' + Convert(varchar(2), MONTH(@Dt)) 
+ '-' + Convert(varchar(2), 1))) + 1 

EDIT: Кроме того, глядя на свой код, вы можете добавить ПОТОЛОК. Если результат == 2,7, это означает, что прошло вторую неделю, однако, он получает округляется до 2, когда он должен быть на самом деле 3.

Если добавить ПОТОЛОК и преобразовать в десятичную должны работать ..

SELECT MONTH(@Dt), 
     YEAR(@Dt), 
     ((CEILING(Convert(decimal,DATEPART(day,@Dt)-1)/7)) + 1) 
Смежные вопросы