2010-02-18 188 views
6

Estoy seguro de que estoy pasando por alto algo muy básico aquí, pero no puedo entenderlo después de consultar y buscar en Google durante aproximadamente una hora.Obtener semanas en SQL

Ya tengo una fecha de existencia, si eso ayuda. Está poblado con el valor de fechas de los últimos años y se actualiza cada noche a través de un proceso almacenado que se ejecuta por un trabajo en el servidor.

Lo que tengo que hacer es retirar las semanas de lunes a domingo para poder unirlas a una tabla de seguimiento para obtener un gráfico de visitas semanal. No quiero escribir 52 declaraciones de selección gradualmente más grandes y unirlas por razones obvias, y no me gusta la idea de cursores.

Ya he hecho esto con meses y días, pero la naturaleza de las semanas me confunde por alguna razón, o es inherentemente diferente.

¿Alguna idea sobre cómo automatizar el proceso sin cursores o una gran selección/unión? Iré por el cursor y lo arrojaré en una mesa todas las noches si es absolutamente necesario, pero espero que no.

FYI mi formato deseado al final sería:

[Week number] | [StartDate] | [EndDate] 

Por cada semana

+1

¿Qué DBMS está usando? –

+0

La base de datos es Sql 2k5. En mi defensa, está etiquetado sql :) –

+3

@C Bauer: En nuestra defensa, SQL mide "Structured Query Language", un lenguaje de programación de base de datos: http://en.wikipedia.org/wiki/SQL :) –

Respuesta

8

Podría estar fuera de curso con lo que está queriendo, pero suena como desea este tipo de la cosa:

- por ejemplo Conde de los registros agrupados por semana, durante 2009

SELECT DATEPART(wk, DateField) AS WeekNumber, COUNT(*) AS HitsForWeek 
FROM SomeTable 
WHERE DateField >= '20090101' AND DateField < '20100101' 
GROUP BY DATEPART(wk, DateField) 
+0

Gracias, es no es lo que quería pero me puso en el camino correcto! –

3

Una cosa añadida - La respuesta de AdaTheDev es correcto, pero por defecto, se le dará de domingo a sábado semanas. Si quieres lunes a domingo semanas, tiene que ejecutar

SET DATEFIRST 1

para establecer el primer día de la semana hasta el lunes (1). Puede consultar @@ DateFirst para ver cuál es su configuración: de forma predeterminada, es 7 (domingo) en la configuración de inglés de Estados Unidos.

0

Puede que prefiera usar datediff(day, '19800107', yourDate)/7 (donde el 7 de enero de 1980 es un lunes conocido), para que no tenga que preocuparse por cuándo el sistema cree que ha comenzado una semana. Además, este mecanismo es muy fácil de adaptar a diferentes semanas sin tener que considerar el valor de @@DATEFIRST, solo elija un domingo conocido, o un jueves conocido, o lo que sea.

1

He encontrado semanas difíciles también, a continuación se muestra el código que uso para convertir una fecha en su grupo de fecha de la semana. A continuación, se incluyen ejemplos que regresarán los fines de semana viernes o semana, comenzando el lunes sin tener que mantener una tabla de apoyo. También puede ajustarlos para usar los sábados y domingos si eso es lo que desea usar.

--Returns the weekending (Friday) for a particular day 
SELECT DATEADD(day, -DATEPART(weekday,yourDate), yourDate)+6 

--Returns the week commencing (Monday) for a particular day 
SELECT DATEADD(day, -DATEPART(weekday,yourDate)+2, yourDate) 

feliz de codificación :)

Cuestiones relacionadas