2015-06-11 6 views
2

Мне нужно отображать даты всех понедельников в заданном диапазоне дат.Найти понедельники между 2 датами

Например, если моя дата начала 01/05/2015 и дата окончания 31/05/2015, мне нужно, чтобы показать

04/05/2015 
11/05/2015 
18/05/2015 
25/05/2015 

Как это возможно?

+1

Есть ли у вас какие-либо справки таблицу со всеми (возможно) даты? – jarlh

+0

@jarlh Вы можете создать такую ​​вспомогательную таблицу с рекурсивным CTE (общее табличное выражение). –

+0

Это идеальный вариант использования для таблицы календаря, каждая база данных должна иметь один. – dnoeth

ответ

5

Эта процедура не зависит от регионов и языков.

Обратите внимание на первую строку с SET DATEFIRST 1.

SET DATEFIRST 1; -- First day of the week is set to monday 

DECLARE @DateFrom DateTime ='20150601', @DateTo DateTime = '20150630' ; 

WITH CTE(dt) 
AS 
(
     SELECT @DateFrom 
     UNION ALL 
     SELECT DATEADD(d, 1, dt) FROM CTE 
     WHERE dt < @DateTo 
) 
SELECT dt FROM CTE where datepart ("dw", dt) = 1; 
1

Использование CTE можно так ..

DECLARE @DateFrom DateTime ='2015-05-01', 
     @DateTo DateTime = '2015-05-31' 

;WITH CTE(dt) 
AS 
(
     SELECT @DateFrom 
     UNION ALL 
     SELECT DATEADD(d, 1, dt) FROM CTE 
     WHERE dt < @DateTo 
) 
SELECT 'Monday', dt FROM CTE 
WHERE DATENAME(dw, dt) In ('Monday') 
+1

** Пожалуйста, учтите, что английский язык не является единственным языком в мире! ** https://msdn.microsoft.com/en-us/library/ms174395.aspx - «Возвращаемое значение зависит от языковой среды, установленной используя SET LANGUAGE и настройкой языка по умолчанию. Конфигурация сервера. Вариант входа в систему. » –

+0

Основной запрос SQL по-прежнему служит цели заданного вопроса. Вопрос был задан на английском языке и, таким образом, ответил. – Hysteria86

+0

Английский язык коммуникаций StackOVerflow. Сервер может работать во Франции. –

0

См: Select dates of a day between two dates.

SELECT [Day],[Dt] FROM dbo.fnGetDatesforAday('7/1/2008','8/31/2008','Sunday') 


CREATE FUNCTION fnGetDatesforAday 
(
     -- Add the parameters for the function here 
     @DtFrom DATETIME, 
     @DtTo DATETIME, 
     @DayName VARCHAR(12) 
) 

RETURNS @DateList TABLE ([Day] varchar(20),Dt datetime) 

AS 
BEGIN 
     IF NOT (@DayName = 'Monday' OR @DayName = 'Sunday' OR @DayName = 'Tuesday' OR @DayName = 'Wednesday' OR @DayName = 'Thursday' OR @DayName = 'Friday' OR @DayName = 'Saturday') 
     BEGIN 
      --Error Insert the error message and return 

      INSERT INTO @DateList 
      SELECT 'Invalid Day',NULL AS DAT 
      RETURN 
     END 

     DECLARE @TotDays INT 
     DECLARE @CNT INT 

     SET @TotDays = DATEDIFF(DD,@DTFROM,@DTTO)-- [NO OF DAYS between two dates] 

     SET @CNT = 0 
     WHILE @TotDays >= @CNT  -- repeat for all days 
     BEGIN 
     -- Pick each single day and check for the day needed 
      IF DATENAME(DW, (@DTTO - @CNT)) = @DAYNAME 
      BEGIN 
        INSERT INTO @DateList 
       SELECT @DAYNAME,(@DTTO - @CNT) AS DAT 
      END 
      SET @CNT = @CNT + 1 
     END 
     RETURN 
END 
+0

То же самое, работает только на английских серверах. –

1
SET FIRSTDATE 7; -- Set's sunday as first day of week, won't work otherwise 

DECLARE @StartDate DATE = '06/01/2015' 

DECLARE @EndDate DATETIME = '06/30/2015' 

DECLARE @TableOfDates TABLE(DateValue DATETIME) 

DECLARE @CurrentDate DATETIME 

SET @CurrentDate = @startDate 

WHILE @CurrentDate <= @endDate 
BEGIN 
    INSERT INTO @TableOfDates(DateValue) VALUES (@CurrentDate) 

    SET @CurrentDate = DATEADD(DAY, 1, @CurrentDate) 
END 

SELECT * FROM @TableOfDates WHERE DATEPART(weekday,Datevalue) = 2 
+0

http://www.sqlfiddle.com/#!6/a6bc4/3/0 Я пробовал это, и я получаю правильный результат для диапазона дат. Он не видел каких-либо особых требований для запуска его только на сервере france, который он просил об общем требовании. @Alias ​​Varghese проверить результаты в скрипке. –

+0

Вы предполагали, что понедельник - второй день недели, но это только в США. Ваш пример работает в других регионах только с 'SET FIRSTDATE 7'. Я отредактировал это, и затем удалю мой downvote. –

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