Получение последнего понедельника текущего месяца с использованием T-sql - PullRequest
4 голосов
/ 28 февраля 2012

Я знаю, что это довольно общий вопрос, но знает ли кто-нибудь хороший способ проверки, является ли дата последним понедельником месяца с использованием T-SQL. Мне нужно использовать его в хранимой процедуре, чтобы определить, возвращает ли хранимая процедура данные или ничего не делает.

Ура!

Ответы [ 4 ]

6 голосов
/ 28 февраля 2012

Следующий выбор вернет 1, если текущая дата - последний понедельник месяца, и 0, если нет.

select 
 case 
 when datepart(dw, GETDATE()) = 2 and DATEPART(month, DATEADD(day, 7, GETDATE())) <> DATEPART(month, GETDATE())
 then 1
 else 0
 end

datepart(dw, GETDATE()) возвращает день недели. Понедельник - 2. Вторая часть добавляет 7 дней к текущей дате и проверяет, что в течение 7 дней месяц изменился (если это не так, это не последний понедельник).

Измените GETDATE() на любую дату, которую вы хотите проверить.

EDIT:

Вы можете превратить его в универсальную функцию и использовать с любой датой, которая вам нравится:

CREATE FUNCTION 
IsLastMondayOfMonth(@dateToCheck datetime)
RETURNS bit
AS
BEGIN
DECLARE
@result bit

SELECT @result =
    CASE  
       WHEN datepart(dw, @dateToCheck) = 2 AND DATEPART(month, DATEADD(day, 7, @dateToCheck)) <> DATEPART(month, @dateToCheck)
    THEN 1
 ELSE 0
 END
 RETURN @result
END
2 голосов
/ 28 февраля 2012

Может быть, что-то вроде этого:

DECLARE @YourDate DATETIME='2012-02-25'
SELECT
    CASE 
        WHEN @YourDate = DATEADD(wk, DATEDIFF(wk,0,DATEADD(month,DATEDIFF(MONTH,0,@YourDate),30)),0)
        THEN 1
        ELSE 0
    END
0 голосов
/ 28 февраля 2012

Хотя вы уже приняли другой ответ, еще более простым решением (на мой взгляд) является использование календарной таблицы , в которой есть столбец с именем IsLastMondayOfMonth или что-то подобное.Таблицы календаря, как правило, гораздо легче поддерживать, чем функции, потому что код не только намного чище, но и когда возникает исключение («из-за необычного выходного дня в этом году нам нужно выполнить нашу обработку месяца в конце дня, яВы уверены, что можете исправить систему, чтобы сделать это? ") вы можете просто обновить таблицу, чтобы обработать ее, вместо добавления потенциально неловкой логики в ваш код.

0 голосов
/ 28 февраля 2012

Это выберет дату, когда дата является последним понедельником месяца, независимо от первой даты. Создание функции, основанной на настройках базы данных, на самом деле не очень хорошая практика.

select d
from (select '2012-02-20' d union all select '2012-02-27' union all select '2012-02-28') a
where datepart(day, dateadd(day, 7 ,d)) < 8 and datediff(day, 0, d) %7 = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...