2011-08-04 20 views
9

Supongamos que tengo 2011-01-03 y quiero obtener el primero de la semana, que es domingo, que es 2011-01-02, ¿cómo hago para hacerlo?¿Cómo obtengo el primer día de la semana de una fecha en mysql?

La razón es que tengo esta consulta:

select 
    YEAR(date_entered) as year, 
    date(date_entered) as week, <-------This is what I want to change to select the first day of the week. 
    SUM(1) as total_ncrs, 
    SUM(case when orgin = picked_up_at then 1 else 0 end) as ncrs_caught_at_station 
from sugarcrm2.ncr_ncr 
where 
sugarcrm2.ncr_ncr.date_entered > date('2011-01-01') 
and orgin in( 
'Silkscreen', 
'Brake', 
'Assembly', 
'Welding', 
'Machining', 
'2000W Laser', 
'Paint Booth 1', 
'Paint Prep', 
'Packaging', 
'PEM', 
'Deburr', 
'Laser ', 
'Paint Booth 2', 
'Toolpath' 
) 
and date_entered is not null 
and orgin is not null 
AND(grading = 'Minor' or grading = 'Major') 
and week(date_entered) > week(current_timestamp) -20 
group by year, week(date_entered) 
order by year asc, week asc 

Y sí, soy consciente de que el origen está mal escrito, pero fue aquí antes de que fuera así que no puedo corregirlo tan Referencia demasiadas aplicaciones internas se .

Por lo tanto, estoy agrupando por semanas pero quiero que llene mi tabla, por lo que no puedo tener todo el comienzo de semanas pareciendo diferentes fechas. ¿Cómo puedo solucionar esto?

Respuesta

26

Si usted necesita para manejar semanas que comienzan en Los lunes, también podrías hacerlo de esa manera. En primer lugar definir una función personalizada FIRST_DAY_OF_WEEK:

DELIMITER ;; 
CREATE FUNCTION FIRST_DAY_OF_WEEK(day DATE) 
RETURNS DATE DETERMINISTIC 
BEGIN 
    RETURN SUBDATE(day, WEEKDAY(day)); 
END;; 
DELIMITER ; 

Y entonces se podría hacer:

SELECT FIRST_DAY_OF_WEEK('2011-01-03'); 

Para su información, MySQL proporciona dos funciones diferentes para recuperar el primer día de la semana. Hay DAYOFWEEK:

Devuelve el índice de días laborables para la fecha (1 = domingo, 2 = lunes, ..., 7 = sábado). Estos valores de índice corresponden al estándar ODBC.

Y WEEKDAY:

devuelve el índice de lunes a viernes por la fecha (0 = Lunes, 1 = martes ... 6 = domingo).

+0

Esto casi me funciona. Me gustaría obtener la fecha para el domingo ya que es el primer día que voy a pasar la semana. Entonces, si paso '2017-06-24' (sábado), FIRST_DAY_OF_WEEK devolverá '2017-06-19' (lunes). ¿Cómo consigo que regrese '2017-06-18' (domingo)? –

5

seleccionar '2011-01-03' - INTERVAL (WEEKDAY ('2011-01-03') + 1) DAY;

devuelve la fecha del primer día de la semana. Puedes mirarlo.

46

Si la semana comienza el domingo hacer esto:

DATE_ADD(mydate, INTERVAL(1-DAYOFWEEK(mydate)) DAY) 

Si la semana comienza el lunes hacer esto:

DATE_ADD(mydate, INTERVAL(-WEEKDAY(mydate)) DAY); 

more info

+0

Aquí comienza los domingos, en Canadá, en este edificio. – davidahines

+0

Sí, pero somos una empresa en Canadá, cuyo período de pago comienza el domingo, y es un informe interno que clasifica a los empleados por períodos de pago, por lo que el primer día de Europa el lunes es redundante. ¡Sin embargo, es una trivia genial! – davidahines

+0

Además, Gran Bretaña ve el domingo como el primer día de la semana también, por lo que no es todo de Europa. – davidahines

1

Este es un enfoque mucho más simple que escribir una función para determinar el primer día de una semana.

Algunas variantes serían como
SELECT DATE_ADD((SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1)DAY),INTERVAL 7 DAY) (para la fecha de finalización de una consulta, por ejemplo, entre "fecha de inicio" y "fecha de fin").
SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1) DAY (para la fecha de inicio de una consulta).

Esto devolverá todos los valores de la semana actual.Una consulta de ejemplo sería el siguiente:
SELECT b.foo FROM bar b
WHERE b.datefield BETWEEN
(SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1) DAY)
AND
(SELECT DATE_ADD((SELECT CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1)DAY),INTERVAL 7 DAY))

0

Esto funciona mí formar

Sólo asegúrese de que ambas fechas en la consulta a continuación son los mismos ...

SELECT ('2017-10-07' - INTERVAL WEEKDAY('2017-10-07') Day) As `mondaythisweek` 

Este que ry returns: 2017-10-02 que es un lunes,

Pero si su primer día es domingo, ¡restar un día del resultado de esto y de wallah!

Cuestiones relacionadas