2011-02-07 26 views

Respuesta

6

Esto le da la semana de la fecha de @dt dentro de su mes. Hay una segunda columna que utiliza una instrucción CASE sobre la expresión que permite alternar entre "impar" o "Incluso"

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

Ese es un gran Richard. ¿Puede ayudarnos con cómo podemos hacer lo contrario? Con un número de mes y semana, ¿podemos obtener la primera y la última fecha en el número de esa semana? – Jinith

0

Prueba esto:

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

da la respuesta equivocada (por mi definición - ver mi respuesta) - dice que está en la semana 1 – RichardTheKiwi

+0

La consulta anterior indica si para la fecha dada la semana es la semana par o la semana impar del mes ... – Chandu

4

que le dará semana Número por cada mes

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

¿Qué tal algo legible, fácilmente personalizable, y predecible ...

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

Creo que esto hace que el enfoque muy obvia:

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 tiene una función CONCAT que se puede utilizar para construir más fácilmente la cadena 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] 
Cuestiones relacionadas