2012-04-04 20 views

Respuesta

5

El siguiente trabajo lo tiene en cuenta el primer día de la semana (domingo, lunes, etc.), solo asegúrate de usar SET DATEFIRST si deseas cambiar el valor predeterminado. SET DATEFIRST 1 hará el primer día de la semana el lunes.

SELECT DATEADD(DAY, 1 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) [WeekStart], 
     DATEADD(DAY, 7 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) [WeekEnd] 

EDITAR

Acabo de releer usted solicita y creo que es posible que después de algo diferente a lo que he dado anteriormente. Si desea que el día de la semana de la primera y la última del mes esto va a hacer el truco:

SELECT DATENAME(WEEKDAY, DATEADD(DAY, 1 - DATEPART(DAY, GETDATE()), GETDATE())) [FirstDayOfMonth], 
     DATENAME(WEEKDAY, DATEADD(DAY, - DATEPART(DAY, DATEADD(MONTH, 1, GETDATE())), DATEADD(MONTH, 1, GETDATE()))) [LastDayOfMonth] 
+0

gracias, Sr.Gareth D, lo tengo, utilizo tu consulta y agrego un código más ahora que viene gracias. –

6

Para conseguir el primer día de uso semana:

select dateadd(wk, datediff(wk, 0, getdate()), 0) 

El último día será el primer día + 6:

select dateadd(wk, datediff(wk, 0, getdate()), 0) + 6 

Advertencia: esta es la cultura sensible. Consulte la documentación en @@datefirst

1

Su requisito no está claro: ¿cuál considera que es el primer y último día de una semana? Domingo y sábado Lunes y viernes? Lunes y domingo? Pero la mejor solución para muchas consultas relacionadas con la fecha es crear un calendar table. Eso le da la capacidad de establecer fácilmente el primer y último día de semanas, meses y años de acuerdo con su definición e incluso en múltiples formatos si es necesario.

Esto es especialmente útil si trabaja con conceptos como años financieros, días hábiles, etc., donde las definiciones varían según el país e incluso la empresa. También es la solución más fácil cuando hay excepciones a su lógica, p. la primera semana del año tiene reglas diferentes a una semana 'normal'.

Con un calendario de mesa se podía rellenar previamente el primer y último día de la semana y luego la consulta podría ser algo como esto:

-- first/last days stored as dates in their own columns 
select FirstDayOfThisWeek, LastDayOfThisWeek 
from dbo.Calendar 
where BaseDate = @SomeDate 

-- first/last days stored as bit flags 
select max(BaseDate) 
from dbo.Calendar 
where BaseDate <= @SomeDate and IsFirstDayOfWeek = 0x1 
0

Aquí i dada

semana, mes, trimestre, semestre, año empiezan y terminan fecha .

 Select CONVERT(varchar(50), GETDATE(),105) 'GETDATE' , 
     CONVERT(varchar(50), DATEADD(DAY, 2 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)),105) [WeekStart], 
CONVERT(varchar(50),DATEADD(DAY, 8 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) ,105)[WeekEnd], 
CONVERT(varchar(50),DATEADD(dd, -DAY(getdate()) + 1, getdate()),105) MonthStart, 
CONVERT(varchar(50),DATEADD(dd, -DAY(DATEADD(mm, 1, getdate())), DATEADD(mm, 1, getdate())),105) MonthStart, 
CONVERT(varchar(50), DATEADD(q, DATEDIFF(q, 0, GETDATE()), 0),105) AS 'QStart Date',  
CONVERT(varchar(50), DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, GETDATE()) + 1,0)),105) AS 'QEnd Date', 
CONVERT(varchar(50), CAST(CAST(((((MONTH(GETDATE()) - 1)/6) * 6) + 1) AS VARCHAR) + '-1-' + CAST(YEAR(GETDATE()) AS VARCHAR) AS DATETIME),105) StartOfHalfYear, 
CONVERT(varchar(50), CAST(CAST(((((MONTH(GETDATE()) - 1)/6) * 6) + 6) AS VARCHAR) + '-1-' + CAST(YEAR(GETDATE()) AS VARCHAR) AS DATETIME),105)EndOfHalfYear, 
CONVERT(varchar(50), DATEADD(yy, DATEDIFF(yy,0,getdate()), 0),105) AS StartOfYear, 
CONVERT(varchar(50), DATEADD(yy, DATEDIFF(yy,0,getdate()) + 1, -1),105) AS EndOfYear 
1

A continuación se muestra una declaración de caso que puede utilizar para crear un valor de fecha para el valor de fecha. Hará que sus semanas comiencen el lunes o el martes o el miércoles ... etc. dependiendo de qué día de la semana haya establecido como @pDate.

crear parámetros

DECLARE @pDate Date = NULL --Replace with your date, which will also be the first day of the week 
DECLARE @pDatePart SMALLINT = DATEPART(dw, @pDate) 

luego poner este caso comunicado después de su selecto

CASE 
    WHEN DATEPART(dw, CAST(DATEVALUE AS DATE)) BETWEEN @pDatePart AND 7 THEN DATEADD(d, (DATEPART(dw, CAST(DATEVALUE AS DATE))*-1)[email protected], CAST(DATEVALUE AS DATE)) 
    WHEN DATEPART(dw, CAST(DATEVALUE AS DATE)) BETWEEN 1 AND @pDatePart-1 THEN DATEADD(d, (DATEPART(dw, CAST(DATEVALUE AS DATE))*-1)+(@pDatePart-7), CAST(DATEVALUE AS DATE)) 
    END 
    AS DynamicWeekBegin 

Siempre se puede obtener la fecha final de la semana, sólo mediante el uso dateadd (d, 6, EL CASO DECLARACIÓN)

Cuestiones relacionadas