2015-12-08 2 views
0

Мне нужно установить дату между двумя диапазонами дат. Это n-й день n-го месяца. Например, мне нужно знать 23-й день каждые 2 месяца в период с 1 января 2015 года по 30 декабря 2015 годаn-й день до n-го месяца в SQL Server

мне нужен запрос в T-SQL для SQL Server

+0

Есть ли у вас календарная таблица? – jarlh

+0

Нет, у меня нет –

+1

, если вы думаете о двух разных числах для примера, это нормально использовать разные буквы для их представления (например, «n-й день месяца m») –

ответ

0

Вы должны использовать рекурсивный запрос в MSSQL.

Здесь первый WITH DT это таблица, в которой вы создали условия:

WITH DT AS 
(
    SELECT CAST('January 1, 2015' as datetime) as dStart, 
     CAST('December 30, 2015' as datetime) as dFinish, 
     31 as nDay, 
     2 as nMonth 
), 
T AS 
(
    SELECT DATEADD(DAY,nDay-1, 
         DATEADD(MONTH, DATEDIFF(MONTH, 0, DStart), 0) 
       ) as d,0 as MonthNumber 
    FROM DT 
    UNION ALL 
    SELECT DATEADD(DAY,nDay-1, 
         DATEADD(MONTH, DATEDIFF(MONTH, 0, DStart) 
            +T.MonthNumber+nMonth,0) 
       )as d, T.MonthNumber+nMonth as MonthNumber 
     FROM T,DT 
     WHERE DATEADD(DAY,nDay-1, 
         DATEADD(MONTH, DATEDIFF(MONTH, 0, DStart) 
            +T.MonthNumber+nMonth,0) 
       )<=DT.dFinish 

) 
SELECT d FROM T,DT WHERE DAY(d)=DT.nDay 

SQLFiddle demo

+0

спасибо, это создает проблему, если я беру 30 как nDay, я получаю вывод как: - 2015-01-30 00: 00: 00.000 2015-02-28 00: 00: 00.000 2015-03-28 00: 00: 00.000 2015-04-28 00: 00: 00.000 2015-05-28 00: 00: 00.000 2015-06-28 00: 00: 00.000 2015-07-28 00: 00: 00.000 2015- 08-28 00: 00: 00.000 2015-09-28 00: 00: 00.000 2015-10-28 00: 00: 00.000 2015-11-28 00: 00: 00.000 2015-12-28 00:00 : 00.000 –

+0

@AwadeshKr: исправлено 28-31 дней. Используйте этот новый запрос. Он просто пропускает эти месяцы (например, FEB 29). Если вам нужны эти даты, просто удалите последний 'WHERE DAY (d) = DT.nDay' – valex

+0

Спасибо @valex за вашу помощь –

0

ли это то, что вы пытаетесь достигать?

DECLARE @startDate datetime 
DECLARE @endDate datetime 
DECLARE @monthToFind INT 
DECLARE @dayToFind INT 

SET @startDate = '01/01/2015' 
SET @endDate = '12/31/2015' 
SET @monthToFind = 2 
SET @dayToFind = 20 

IF MONTH(@startDate) + (@monthToFind - 1) BETWEEN MONTH(@startDate) AND MONTH(@endDate) 
AND YEAR(@startDate) = YEAR(@endDate) 
BEGIN 
    DECLARE @setTheDate datetime 
    SET @setTheDate = CAST(MONTH(@startDate) + (@monthToFind - 1) AS varchar) + '/' + CAST(@dayToFind AS varchar) + '/' + CAST(YEAR(@startDate) AS varchar) 

    SELECT DATENAME(DW,@setTheDate) 
END 
+0

Спасибо, но это не то, что я пытаюсь получить. Я хочу, чтобы он получил всю дату между диапазоном. Например, мне нужно знать 23-й день каждого второго месяца с 1 января 2015 года по 30 декабря 2015 года. Мой ожидаемый результат должен быть 23 января 2015 года, 23 марта, 23 мая и т. Д. До декабря. –

0

Это явно домашние задания, и точка домашние задания, чтобы узнать, как дела и решить проблемы, а не заставить других делать это за вас. Таким образом - указатели для этого правильно, а не для копирования и вставки.

  • Номера/табличные столы идеально подходят для такого рода вещей. Создайте функцию, которая возвращает список последовательных целых чисел в диапазоне. Более общий, чем таблица календаря, и вы можете использовать его для получения таблицы календаря позже, если вам это нужно.
  • Когда вы получите это, DATEDIFF даст вам количество дней между двумя датами. Используйте это, чтобы определить размер вашего диапазона, DATEADD, чтобы увеличить свою дату и, возможно, DATEPART, чтобы проверить, что дата - n-й день месяца.

Беспокойство с этими битами ненадолго, и вы это сделаете.

Смежные вопросы