2012-05-03 6 views

Respuesta

19

Es necesario utilizar primero DATEFIRST para establecer Saturday como el primer día de tu semana El valor indica el lunes y el valor indica el día sábado. Luego puede usar el DATEPART con week o wk o ww para agrupar los valores de la columna de fecha.

Se puede ver en los datos de ejemplo a continuación que los valores para las fechas 2012-01-07 y 2012-01-08 se agrupan bajo weekno porque 2012-01-07 es una Sábado. El 1 de enero de de cualquier año es siempre la primera semana del año.

Click here to view the output in SQL Fiddle.

Guión:

CREATE TABLE weekdays 
(
    datevalue datetime NOT NULL 
    , numericvalue INT  NOT NULL 
); 

INSERT INTO weekdays (datevalue, numericvalue) VALUES 
    ('2012-01-01', 4), 
    ('2012-01-02', 1), 
    ('2012-01-07', 2), 
    ('2012-01-08', 8), 
    ('2012-01-14', 3), 
    ('2012-01-15', 2), 
    ('2012-01-19', 6); 

SET DATEFIRST 6; 

SELECT  DATEPART(wk, datevalue)  weekno 
     , SUM(numericvalue)   totalvalue 
FROM  weekdays 
GROUP BY DATEPART(wk, datevalue) 

salida:

weekno totalvalue 
------ ---------- 
    1  5 
    2  10 
    3  11 
1

OK, no probado, ya que no tenemos al alcance de SQL Server, aunque traducción directamente en MySQL parecía funcionar como se esperaba:

SELECT * 
    FROM (SELECT your_date_field, 
       DATEADD(D, 
       -(DATEPART(DW,your_date_field) MOD 7), your_date_field) AS saturday 
      FROM your_table) 
GROUP BY saturday 
ORDER BY your_date_field 
+0

+1 por esfuerzo. Sin embargo, no puedo decir si funcionó o no, ya que la respuesta de Siva no fue tan asombrosa. –

+0

Eso es realmente lo único que realmente envidio de otros dbms ... la capacidad de usar alias de la cláusula de selección en otras partes de la consulta. –

1

tenido problemas reales con esto, pero esto impide que las tablas adicionales y DATEFIRST que se pueden prevenir desde ha fijado . Aquí está mi respuesta usando el método de fecha conocida y los registros de llamadas que se recuperan.

19000101 = Lunes - siempre es fácil de recordar, por tanto, establecer el sábado como 19000106

SELECT MIN(dateadd(day, datediff(
day,'19000106', CallRecords.CallStartTime)/7*7, '19000106')) 
AS CallStartTime 
FROM CallRecords 
GROUP BY DATEDIFF(day,'19000106', CallRecords.CallStartTime)/7 

Probado en SQL Server y SQL Server Compact 4.0

2

Se debe utilizar la función de DATEPART como:

SELECT  DATEPART(wk, Date), SUM(Value) 
FROM  Table 
GROUP BY DATEPART(wk, Date) 

Espero que esto te ayude.

Cuestiones relacionadas