Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak uzyskać listę dat rozpoczęcia tygodnia (poniedziałek) i daty zakończenia (niedziela) między dwiema datami?

Będzie to działać tak długo, jak odstępy wynoszą 38 lat lub mniej. Zapewni lepszą wydajność i nie będzie opierać się na lokalnych ustawieniach serwera.

To ustawienie spowoduje, że skrypt zwróci nieprawidłowy wynik:

set datefirst 1
select * from dbo.fnGetWeeksBetweenDates('2014-03-21','2014-03-21')

Oznacza to, że Twoje ustawienia lokalne są obecnie w konflikcie z Twoimi potrzebami, a Twój kod się kompensuje.

Oto scenariusz. Scenariusz jest ograniczony do 38 lat ze względu na wydajność (nie wydaje mi się, żebyś potrzebował większych interwałów). Wydłużenie go na kolejne lata będzie dość łatwe.

DECLARE @FromDate DATE = '2014-03-21'    
DECLARE @ToDate DATE  = '2014-03-24'    

SELECT @fromdate = dateadd(day, datediff(day, 0, @FromDate)/7*7, 0), 
@todate = dateadd(day, datediff(day, 0, @ToDate)/7*7, 6)

SELECT dateadd(d, number * 7, @fromdate) Start_Week, 
dateadd(d, number * 7 + 6, @fromdate) End_Week
FROM
master..spt_values
WHERE type = 'P' and
@todate >= dateadd(d, number * 7, @fromdate)

Wynik:

Start_Week  End_Week
2014-03-17  2014-03-23
2014-03-24  2014-03-30


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Instrukcja SQL - Jak zwiększyć szybkość indeksowania?

  2. Sporadyczne awarie połączenia ODBC

  3. Jak zsumować Konta

  4. łączenie pojedynczej kolumny w TSQL

  5. Szybkie porady dotyczące naprawy i przywracania bazy danych SQL bez kopii zapasowej