Получить первое воскресенье следующего месяца, используя T-SQL - PullRequest
5 голосов
/ 01 октября 2009

Ищите способ получить дату в формате «01.11.2009», которая станет первым воскресеньем следующего месяца. Я хочу выполнить этот запрос после первого воскресенья октября, чтобы получить первое воскресенье следующего месяца. Каков наилучший способ сделать это с помощью запроса T-SQL?

Спасибо

Ответы [ 9 ]

7 голосов
/ 02 октября 2009

попробуйте это:

Declare @D Datetime 
Set @D = [Some date for which you want the following months' first sunday]
Select DateAdd(day, (8-DatePart(weekday, 
    DateAdd(Month, 1+DateDiff(Month, 0, @D), 0)))%7, 
    DateAdd(Month, 1+DateDiff(Month, 0, @D), 0))

РЕДАКТИРОВАТЬ Примечания:

Первое число следующего месяца задается выражением:

DateAdd(Month, 1+DateDiff(Month, 0, @D), 0)

или: который может быть изменен, чтобы дать первый месяц два месяца, изменив 1 на 2:

DateAdd(Month, 2+DateDiff(Month, 0, @D), 0) 

РЕДАКТИРОВАТЬ: В ответ на @NissanFan и @Anthony: изменить это так, чтобы возвращать первый понедельник вторник, среда и т. Д., Изменить значение 8 на 9, 10, 11 и т. Д.

Declare @Sun TinyInt Set @Sun = 8
Declare @Mon TinyInt Set @Mon = 9
Declare @Tue TinyInt Set @Tue = 10
Declare @Wed TinyInt Set @Wed = 11
Declare @Thu TinyInt Set @Thu = 12
Declare @Fri TinyInt Set @Fri = 13
Declare @Sat TinyInt Set @Sat = 14
Declare @D Datetime, @FONM DateTime -- FirstofNextMonth 
Set @D = [Some date for which you want the following months' first sunday]
Set @FONM = DateAdd(Month, 1+DateDiff(Month, 0, @D),0)

Select 
  DateAdd(day, (@Sun -DatePart(weekday, @FONM))%7, @FONM) firstSunInNextMonth,
  DateAdd(day, (@Mon -DatePart(weekday, @FONM))%7, @FONM) firstMonInNextMonth,
  DateAdd(day, (@Tue -DatePart(weekday, @FONM))%7, @FONM) firstTueInNextMonth,
  DateAdd(day, (@Wed -DatePart(weekday, @FONM))%7, @FONM) firstWedInNextMonth,
  DateAdd(day, (@Thu -DatePart(weekday, @FONM))%7, @FONM) firstThuInNextMonth,
  DateAdd(day, (@Fri -DatePart(weekday, @FONM))%7, @FONM) firstFriInNextMonth,
  DateAdd(day, (@Sat -DatePart(weekday, @FONM))%7, @FONM) firstSatInNextMonth
1 голос
/ 11 марта 2011

Вот запрос для получения первого рабочего дня следующего месяца

DECLARE @DAYOFWEEK INT,@ReminderDate DateTime
SET @DAYOFWEEK = DATEPART( WEEKDAY,DateAdd(D,- Day(GetDate())+1, DATEADD(M,1,GetDate())) )
Print @DAYOFWEEK
If @DAYOFWEEK = 1
Set @ReminderDate = DateAdd(D,- Day(GetDate())+2, DATEADD(M,1,GetDate()))
Else If @DAYOFWEEK =7
Set @ReminderDate = DateAdd(D,- Day(GetDate())+3, DATEADD(M,1,GetDate()))
Else
Set @ReminderDate = DateAdd(D,- Day(GetDate())+1, DATEADD(M,1,GetDate()))
Print @ReminderDate
1 голос
/ 01 октября 2009

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

Итак, давайте попробуем:

DECLARE @DateTime DATETIME

Установите дату начала, затем добавьте 1 день, пока не найдете то, что ищете. Использовать имя даты с dw ...

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

1 голос
/ 01 октября 2009

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

Взгляните на это: http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

Это также может помочь: http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=99696

0 голосов
/ 19 мая 2016

Ссылка взята из этого блога:

SQL Server 2012 представил один новый TSQL EOMONTH, который возвращает последний день месяца, который содержит указанную дату с необязательным смещением.

CREATE TABLE tbl_Test_EOMONTH
(
    SampleDate DATETIME
)
GO

INSERT INTO tbl_Test_EOMONTH VALUES ('2015-12-20')
INSERT INTO tbl_Test_EOMONTH VALUES ('2015-11-08')
INSERT INTO tbl_Test_EOMONTH VALUES ('2015-10-16')
INSERT INTO tbl_Test_EOMONTH VALUES ('2015-09-26')
INSERT INTO tbl_Test_EOMONTH VALUES ('2016-01-31') 
GO

SELECT 
    DATEADD(DAY,8-DATEPART(WEEKDAY,DATEADD(DAY,0,EOMONTH([SampleDate])))
    ,EOMONTH([SampleDate])) AS FirstSunday_ofTheNextMonth
FROM tbl_Test_EOMONTH
GO
0 голосов
/ 10 мая 2011

Я считаю, что ответ таков

SELECT  DATEADD(Month, DATEDIFF(Month, 0, GETDATE()) + 1, 0) + 6 - (DATEPART(Weekday,
                  DATEADD(Month,
                      DATEDIFF(Month,0, GETDATE()) + 1, 0))
                  + @@DateFirst + 5) % 7 --FIRST sunday of following month
0 голосов
/ 02 октября 2009

Это было бы проще всего со вспомогательной календарной таблицей. См. эту ссылку , например.

Однако, это может быть сделано без такового, хотя это довольно сложно. Здесь я предполагаю, что вы хотите первую будущую дату, это первое воскресенье месяца. Я написал это с переменной @now для - хорошо - теперь, так что это проще для тестирования. Возможно, можно было бы написать более просто, но я думаю, что у этого больше шансов быть правильным, чем у быстро написанных простых решений. [Исправлено добавлением DAY (d) <8] </p>

SET @now = GETDATE();
WITH Seven(i) AS (
  SELECT -1 UNION ALL SELECT 0 UNION ALL SELECT 1
            UNION ALL SELECT 3 UNION ALL SELECT 4
            UNION ALL SELECT 5 UNION ALL SELECT 6
), Candidates(d) AS (
  SELECT DATEADD(WEEK,i+DATEDIFF(WEEK,'19000107',@now),'19000107')
  FROM Seven
) 
  SELECT TOP (1) d AS SoonestFutureFirstSunday
  FROM Candidates
  WHERE DAY(d) < 8 AND MONTH(d) >= MONTH(@now)
  AND (MONTH(d) > MONTH(@now) OR DAY(d) > DAY(@now)) 
  ORDER BY d;      ORDER BY d;
0 голосов
/ 02 октября 2009

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

Сначала получите текущий месяц и добавьте один месяц. Затем установите дату этой переменной, чтобы быть первой. Затем найдите значение дня для этой даты (предположим, понедельники 1, а воскресенья 7). Затем вычтите значение дня 1-го числа месяца из значения дня воскресенья (7).

Теперь у вас есть количество дней между первым месяцем и первым воскресеньем. Затем вы можете добавить это в переменную даты, чтобы получить первое воскресенье, или, поскольку мы знаем, что первое число месяца равно 1, вы можете просто добавить единицу к разнице (найденной в последнем шаге выше), и это дата первое воскресенье (Вы должны добавить один, потому что он вычитает, и поэтому, если первое число в данном месяце - воскресенье, вы получите 0).

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

0 голосов
/ 02 октября 2009

Попробуйте этот код как функцию:

-- Variables
DECLARE @DATE DATETIME
DECLARE @DAY INT
DECLARE @DAYOFWEEK INT
DECLARE @TESTDATE DATETIME

-- Set
SET @TESTDATE = GETDATE()
SET @DATE = DATEADD( MONTH, 1, @TESTDATE )
SET @DAY = DATEPART( DAY, @TESTDATE )
SET @DATE = DATEADD( DAY, -@DAY + 1, @DATE )
SET @DAYOFWEEK = DATEPART( WEEKDAY, @DATE )
IF @DAYOFWEEK > 1
BEGIN
    SET @DAYOFWEEK = 8 - @DAYOFWEEK
END
ELSE
BEGIN
    SET @DAYOFWEEK = 0
END

SET @DATE = DATEADD( DAY, @DAYOFWEEK, @DATE )

-- Display
PRINT @TESTDATE
PRINT @DAY
PRINT @DAYOFWEEK
PRINT @DATE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...