2011-02-07 11 views

Odpowiedz

6

To daje tygodnia od daty @dt w jej miesiącu. Jest 2nd kolumna, która wykorzystuje oświadczenie CASE nad wypowiedzi, aby pokazać albo „Nieparzyste” lub „Parzyste”

declare @dt datetime 
set @dt = GETDATE() 

select 
    WhichWeekOfMonth = datepart(wk, @dt) 
        - datepart(wk,dateadd(m, DATEDIFF(M, 0, @dt), 0)) + 1, 
    case when (datepart(wk, @dt) 
      - datepart(wk,dateadd(m, DATEDIFF(M, 0, @dt), 0)) + 1) % 2 = 1 
     then 'Odd' else 'Even' end 
+0

To jest wspaniały Richard. Czy możesz również pomóc, w jaki sposób możemy zrobić odwrotny proces - Pod warunkiem, że miesiąc i numer tygodnia, możemy uzyskać pierwsze i ostatnie daty w tym tygodniu? – Jinith

0

Spróbuj tego:

SELECT (DATEPART(d, '02/07/2011')/7)%2 AS WeekNo, --Replace your date column in place of '02/07/2011' 
     CASE (DATEPART(d, '02/07/2011')/7)%2 
       WHEN 1 THEN 'Odd' 
       ELSE 'Even' 
      END AS WeekType 
+0

daje złą odpowiedź (według mojej definicji - patrz mój odpowiedź) - mówi, że jest w tygodniu 1 – RichardTheKiwi

+0

Powyższe zapytanie podaje, czy dla podanej daty tygodnia jest tygodniowy czy nieparzysty tydzień miesiąca ... – Chandu

4

To daje tygodniową liczbę dla każdego miesiąca

declare @dates datetime 
select @dates='2011-03-22' 
SELECT datepart(dd,@dates), ceiling (cast(datepart(dd,@dates)as numeric(38,8))/7) 
3

jak o coś czytelny, łatwo konfigurowalny i przewidywalne ...

DECLARE @dayOfMonth AS INT; 
SET @dayOfMonth = DATEPART(DAY, '3/14/2013'); 
SELECT CASE 
    WHEN @dayOfMonth < 8 THEN 1 
    WHEN @dayOfMonth < 15 THEN 2 
    WHEN @dayOfMonth < 22 THEN 3 
    ELSE 4 
END AS weekOfMonth; 
0

myślę, że to sprawia, że ​​podejście bardzo oczywiste:

DECLARE @DayOne DATETIME 
DECLARE @ThisDay DATETIME 
SET @ThisDay = GETDATE() 
SET @DayOne = CAST(CAST(MONTH(@ThisDay) AS VARCHAR) + '/1/' + CAST(YEAR(@ThisDay) AS VARCHAR) AS DATETIME) 
SELECT (DATEPART(wk, @ThisDay) - DATEPART(wk, @DayOne) + 1) AS [Week Of Month] 

SQL Server 2012 posiada funkcję CONCAT które mogą być używane łatwiej zbudować ciąg DayOne:

DECLARE @DayOne DATETIME 
DECLARE @ThisDay DATETIME 
SET @ThisDay = GETDATE() 
SET @DayOne = CAST(CONCAT(MONTH(@ThisDay), '/1/', YEAR(@ThisDay)) AS DATETIME) 
SELECT (DATEPART(wk, @ThisDay) - DATEPART(wk, @DayOne) + 1) AS [Week Of Month]