Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   días de la semana (https://www.clubdelphi.com/foros/showthread.php?t=88136)

gustavosv 16-04-2015 19:27:41

días de la semana
 
Hola, uso MySQL y quiero hacer una consulta que me diga el monto de las ventas de un período (mes, rango de fechas, ...) agrupado por el día de la semana, en otras palabras saber cuánto se vendió los lunes, los martes, ...

Tengo el siguiente SQL pero solo he podido llegar hasta el índice del día de la semana:
Código SQL [-]
SELECT WEEKDAY(fraFecha), SUM(dfrCantidad) AS TotalCANTIDAD
FROM detallefra
INNER JOIN factura ON fraIdPrefijo = dfrIdPrefijo AND fraNroFactura = dfrNroFactura
WHERE fraFecha BETWEEN :pFch1 AND :pFch2
GROUP BY WEEKDAY(fraFecha)
ORDER BY WEEKDAY(fraFecha)

La pregunta es, cómo hago para que en lugar de 0, 1, 2, 3, 4, 5, 6, 7 me salga Lunes, Martes, Miércoles, .... Domingo ??

Saludos,

GustavoSV

ecfisa 16-04-2015 20:10:21

Hola Gustavo.

No uso MySQL, pero fijate si te sirve la función DAYNAME() que según indica el enlace, devuelve el nombre del día de la semana.

Yo intentaría algo así:
Código SQL [-]
SELECT DAYNAME( WEEKDAY(fraFecha) ) ...
Pero no tengo forma de comprobarlo, es sólo una presunción.

Saludos :)

AgustinOrtu 16-04-2015 20:12:24

Podes hacerlo en un evento desde Delphi o en la propia sentencia SQL (nunca lo hice yo de esta manera)

Desde delphi, tenes que asignar un metodo en el evento OnGetText del campo. Asi como accedes al valor usando FieldByName('fraFecha').Value, podes hacer algo como esto

Código Delphi [-]

interface

  TForm1 = class(TForm)
  ...
  private
    function WeekDayToStr(Day: integer): string;
    procedure fraFechaOnGetText(Sender: TField; var Text: string; DisplayField: boolean);

Código Delphi [-]
function TForm1.WeekDayToStr(Day: integer): string;
begin
  case Day of
    0: Result := 'Lunes'; // o domingo, eso no se como lo modelas
    1: Result := 'Martes';
    .. 
  end;
end;

procedure TForm1.fraFechaOnGetText(Sender: TField; var Text: string; DisplayField: boolean);
begin
    if not(Sender.IsNull) then
        Text := WeekDayToStr(Sender.AsInteger);
end;

Y en algun evento antes de pedir los datos, o en el OnCreate, OnShow del form.. asignas a tu campo este evento, asi

Código Delphi [-]
  with DataSet, Query, etc.. do  
    FieldByName('fraFecha').OnGetText := fraFechaOnGetText;

Obviamente el DataSet, Query.. debe estar creado (no es NIL) y abierto, para que pueda "ver" al campo

Saludos

ecfisa 16-04-2015 20:38:31

Hola Gustavo.

Leyendo un poco más, veo que simplemente enviando a la funcion DAYNAME la fecha como argumento obtenes el nombre día, vg.:
Código SQL [-]
SELECT DAYNAME('2015-04-16')
(Thursday)

La variable de sistema lc_time_names te permite cambiar el idioma, ejemplo:
Código SQL [-]
SET lc_time_names = 'es_CO';
En este enlace, MySQL Server Locale Support, vas a encontrar como configurar distintas variables.

Saludos :)

gustavosv 16-04-2015 21:28:41

la función WEEKDAY() regresa un número entre 0 y 6, por lo tanto DAYNAME() no me sirve porque espera un argumento de tipo fecha.

Aplicaré lo de configurar el lenguaje, interesante ...

Voy a intentar con lo que me dice AgustinOrto, a ver como lo pongo en la clase que tengo para graficar.

Gracias ! ;)

ecfisa 16-04-2015 21:42:05

Cita:

Empezado por gustavosv (Mensaje 491438)
la función WEEKDAY() regresa un número entre 0 y 6, por lo tanto DAYNAME() no me sirve porque espera un argumento de tipo fecha.

¿ Pero no le estas pasando un valor tipo fecha a WEEKDAY() ?
Código SQL [-]
SELECT WEEKDAY(fraFecha), SUM(dfrCantidad) AS TotalCANTIDAD
FROM detallefra
...
Si no interpreté mal, bastaría con reemplazar la función WEEKDAY() por DAYNAME() para obtener el nombre del día:
Código SQL [-]
SELECT DAYNAME(fraFecha), SUM(dfrCantidad) AS TotalCANTIDAD
FROM detallefra
...

Saludos :)

gustavosv 16-04-2015 22:00:16

Hola Daniel, claro, tienes razón, no la veía de esa manera, me quedó así con idioma y todo ...:

Código SQL [-]
SET lc_time_names = 'es_CO';

SELECT DAYNAME(fraFecha), SUM(dfrCantidad) AS TotalCANTIDAD
FROM pos_detallefra
INNER JOIN pos_factura ON fraIdPrefijo = dfrIdPrefijo AND fraNroFactura = dfrNroFactura
WHERE fraFecha BETWEEN :Fch1 AND :Fch2
GROUP BY DAYNAME(fraFecha)
ORDER BY WEEKDAY(fraFecha);

estaba embelesado con el WEEKDAY() ... :o ahora solo lo uso para ordenar

Gracias !


La franja horaria es GMT +2. Ahora son las 07:42:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi