Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   consulta por rango de fechas (https://www.clubdelphi.com/foros/showthread.php?t=96548)

oscarac 26-12-2023 04:36:10

consulta por rango de fechas
 
buenas noches...
quiero ver si me pueden ayudar a optimizar este proceso

tengo turnos

01 00:01 06:00 Amanecida
02 06:01 12:00 Mañana
03 12:01 18:00 Tarde
04 18:01 24:00 Noche

y tengo ventas entre esas horas
lo que quiero es sacar el total de ventas en los turnos correspondientes, eso implica que si tengo una venta a las 07:00 am la venta corresponde al turno 02, venta a las 17:35, corresponde al turno 03... y asi sucesivamente

lo que hago es ... genero una consulta (group) por las horas de las ventas y lo recorro para buscar el rango en el que esta, pero no me parece optimo ese proceso, asi que recurro a uds. para ver si tienen alguna idea para optimizar la consulta o si se puede hacer via subconsultas o algo asi

chenech 26-12-2023 15:23:42

Hola, yo tengo algo parecido y lo que hago es que en el momento de generar la factura grabo el número correspondiente, luego las consultas vuelan por que es por el 1, 2, 3, etc.
Resumiendo, en el momento de generar la venta, busco el número de turno que le corresponde y aparte de grabar la hora en la factura, también grabo el turno.
Generas un campo nuevo en la base de datos para almacenar ese número y modificas el procedimiento de grabar para que busque al que corresponde y lo grabe, 1, 2, etc.
Un saludo.

pgranados 26-12-2023 16:50:09

Puedes poner la sentencia SQL que usas?

delphi.com.ar 26-12-2023 20:55:28

Siempre primero pensar en crear el modelo de datos normalizando la información. En este caso crear la tabla de turnos, luego en armar la consulta:

Código SQL [-]
DROP TABLE IF EXISTS TURNO;

CREATE TABLE TURNO
(
  ID_TURNO INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT "Identificador único de registro",
  DESCRIPCION VARCHAR(100) NOT NULL COMMENT "Descripción del turno",
  DESDE TIME NOT NULL,
  HASTA TIME NOT NULL,
  PRIMARY KEY PK_TURNO (ID_TURNO)
);

INSERT INTO TURNO (DESCRIPCION, DESDE, HASTA) VALUES
('Amanecida', '00:01', '06:00'),
('Mañana',    '06:01', '12:00'),
('Tarde',     '12:01', '18:00'),
('Noche',     '18:01', '24:00');


SELECT DESCRIPCION, COUNT(*) 
FROM TURNO
JOIN VENTA ON TIME(FECHA) BETWEEN TURNO.DESDE AND TURNO.HASTA
GROUP BY TURNO.DESCRIPCION;

Ese ejemplo funciona en MySql.

PD: Le agregaría a la tabla TURNO un trigger de validación que no permita dos turnos en el mismo rango, y que el rango sea válido.

Saludos

oscarac 29-12-2023 22:30:12

lo solucioné de esta manera

-- aqui tengo las ventas en rango de fecha o en el dia.. dependiendo del where
Código SQL [-]
SELECT Left(hora,2) as hora, a.IDEN, Sum (d.PT) as PT into #d
  FROM TBLCONSUMOC c
  left join tblconsumod d on c.tdc = d.tdc and c.doc = d.doc
  left join tblarticulo a on d.kod = a.kod
  where
 convert(varchar, c.f_doc, 112) = '20231225' and ISNULL(c.sts,'') = ''
  group by Left(hora,2), a.iden
  order by Left(hora,2), a.iden

Código SQL [-]
  select r1.kod, r1.descl, SUM(PT) from (Select * from tblturno) r1, #d 
  where hora between r1.hini and r1.nfin
  group by r1.kod, r1.descl

aqui obtengo lo que deseo


lo dejo por si le puede servir a alguien


La franja horaria es GMT +2. Ahora son las 00:53:47.

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