2009-07-29 24 views
36

estoy usando DAYOFWEEK() función en MySQL que devuelve para Domingo. Pero en mi país, la semana comienza con lunes, no domingo. ¿Hay alguna posibilidad de obtener un día de semana de MySQL formateado como: (1 - lunes, 2 - martes, ...)?MySQL DAYOFWEEK() - mi semana comienza con el lunes

+0

que sé se puede hacer con algunas condiciones desagradables. Incluso probé el enfoque de módulo que me parece que no funciona (debido a la extraña implementación de Modulo en MySQL). Nada funcionó para mí hasta ahora. – picca

+1

es un error de mysql. Las semanas comienzan el lunes según el estándar iso. http://en.wikipedia.org/wiki/ISO_week_date – woens

+1

No es un error. 'DAYOFWEEK()' usa el estándar ODBC. – rgtk

Respuesta

85

Uso WEEKDAY() en lugar de DAYOFWEEK(), que comienza el lunes.

Si necesita comenzar en el índice 1, use o WEEKDAY() + 1.

+0

A veces soy tonto. Pude entender que esa función es soportada nativamente por MySQL. Gracias, nos. – picca

+13

no eres tú el tonto. ¿Por qué día de la semana devolvería un valor diferente al de dayofweek? Esa es una idea tonta de mySQL. –

7

¿Qué hay de restar una y cambiando Domingo

IF(DAYOFWEEK() = 1, 7, DAYOFWEEK() - 1) 

Por supuesto que tendría que hacer esto para cada consulta.

+1

1 = Sunday es el estándar ODBC, por lo que debería estar en la consulta, creo. –

+0

¿Por qué el voto a favor? –

+0

Esto funciona, pero es demasiado complicado. – picca

1

se pudo escribir una UDF y tomar un valor para decirle qué día de la semana debe ser de 1 a verse así (basándose en la respuesta de Juan a utilizar MOD en lugar de CASE):

DROP FUNCTION IF EXISTS `reporting`.`udfDayOfWeek`; 
DELIMITER | 
CREATE FUNCTION `reporting`.`udfDayOfWeek` (
    _date DATETIME, 
    _firstDay TINYINT 
) RETURNS tinyint(4) 
FUNCTION_BLOCK: BEGIN 
    DECLARE _dayOfWeek, _offset TINYINT; 
    SET _offset = 8 - _firstDay; 
    SET _dayOfWeek = (DAYOFWEEK(_date) + _offset) MOD 7; 
    IF _dayOfWeek = 0 THEN 
    SET _dayOfWeek = 7; 
    END IF; 
    RETURN _dayOfWeek; 
END FUNCTION_BLOCK 

para llamar a esta función para darle el día actual de la semana cuando su valor de semana comienza un martes, por ejemplo, que se dice:

SELECT udfDayOfWeek(NOW(), 3); 

cosa buena de tenerlo como una UDF es que también se podría llamar el un campo de conjunto de resultados como este:

SELECT 
    udfDayOfWeek(p.SignupDate, 3) AS SignupDayOfWeek, 
    p.FirstName, 
    p.LastName 
FROM Profile p; 
+2

¿Hablas en serio? – hobodave

+1

+1 lol ... así que me aburrí un poco. – codemonkey

+2

Estás loco codemonkey: D – picca

14

Intente utilizar la función WEEKDAY().

Devuelve el índice de días de la semana para la fecha (0 = lunes, 1 = martes, ... 6 = domingo).

Cuestiones relacionadas