MySQL - SELECT CON HORA DEL SISTEMA

 
Vista:
sin imagen de perfil
Val: 7
Ha aumentado su posición en 8 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

SELECT CON HORA DEL SISTEMA

Publicado por CARLOS (4 intervenciones) el 10/02/2018 09:56:54
Buenos días, foreros:

Estoy inmerso en una mejora de un proyecto de control de Accesos con Rfid que consiste en añadirle caducidad y franja horaria a los usuarios.

Entonces, dada la tabla

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
DROP TABLE IF EXISTS `users`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `usersrfid` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `empresa` varchar(30) NOT NULL,
  `nombre` varchar(25) NOT NULL,
  `apellido1` varchar(25) NOT NULL,
  `apellido2` varchar(25) NOT NULL,
  `nprod` int(6) NOT NULL,
  `serial1` varchar(10) NOT NULL,
  `serial2` varchar(10) NOT NULL,
  `rfid` varchar(8) NOT NULL,
  `devProfileId` int(2) NOT NULL DEFAULT '0',
  `HoraIni` time NOT NULL DEFAULT '12:00:00',
  `HoraEnd` time NOT NULL DEFAULT '16:00:00',
  `endDate` date NOT NULL DEFAULT '2035-12-31',
  `service` varchar(30) NOT NULL,
  PRIMARY KEY (`serial1`),
  UNIQUE KEY `serial` (`serial1`),
  KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=100010 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
 
--
-- Dumping data for table `usersrfid`
--
 
LOCK TABLES `usersrfid` WRITE;
/*!40000 ALTER TABLE `usersrfid` DISABLE KEYS */;
INSERT INTO `usersrfid` VALUES
(0,'SAMPLE','PROFILE','TYPE','0',59990,'4269959534','','0',0,'12:00:00','16:00:00','2035-12-31','Example'),
(1,'SAMPLE','PROFILE','TYPE','1',59991,'4269956318','','0',1,'12:00:00','16:00:00','2035-12-31','Example'),
(2,'SAMPLE','PROFILE','TYPE','2',59992,'4269939662','','0',2,'12:00:00','16:00:00','2035-12-31','Example'),
(3,'SAMPLE','PROFILE','TYPE','3',59993,'4269934878','','0',3,'12:00:00','16:00:00','2035-12-31','Example'),
(4,'SAMPLE','PROFILE','TYPE','4',59994,'4269958510','','0',4,'08:00:00','12:00:00','2015-12-31','Example'),
(5,'SAMPLE','PROFILE','TYPE','5',59995,'4269936206','','0',5,'08:00:00','12:00:00','2035-12-31','Example'),
(6,'SAMPLE','PROFILE','TYPE','6',59996,'4269935374','','0',6,'12:00:00','16:00:00','2035-12-31','Example'),
(7,'SAMPLE','PROFILE','TYPE','7',59997,'4269956046','','0',7,'12:00:00','16:00:00','2035-12-31','Example'),
(8,'SAMPLE','PROFILE','TYPE','8',59998,'4269960270','','0',8,'12:00:00','16:00:00','2035-12-31','Example'),
(9,'SAMPLE','PROFILE','TYPE','9',59999,'4269957054','','0',9,'12:00:00','16:00:00','2035-12-31','Example');
/*!40000 ALTER TABLE `usersrfid` ENABLE KEYS */;
UNLOCK TABLES;

Trato de hacer un SELECT que busque si existe un registro "Serial1" o "Serial2" cuyo campo endDate sea posterior a la fecha del sistema y siempre que la hora del sistema se encuentre en la franja horaria comprendida entre HoraIni y HoraEnd.

De esta forma, si la fecha/hora actual es "10-02-2018 10:00:00" me devolveria solamente el registro 5 cuya franja horaria va desde las 08:00:00 hasta las 12:00:00 horas y su fecha de caducidad es a final de 2035. Sin embargo, el registro 4 cumple con la franja pero ya esta caducado.

Tengo el siguiente codigo en Python pero acaba de funcionar bien ...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# If we have the UID, continue to usersrfid
if status == MIFAREReader.MI_OK:
 
    temp0 = (hex(uid[0])).zfill(4)
    temp1 = (hex(uid[1])).zfill(4)
    temp2 = (hex(uid[2])).zfill(4)
    temp3 = (hex(uid[3])).zfill(4)
 
    temp = temp0 + temp1 + temp2 + temp3
 
    serial = temp.upper().replace("0X","")
    today = time.strftime("%Y-%m-%d", time.localtime())
 
    resultado = gmysql.cur.execute("""SELECT * FROM usersrfid WHERE serial1 = %s OR serial2 = %s""",(serial,serial,))
 
    # Print UID
    row = gmysql.cur.fetchone()
	if (resultado == 1 ):
        section = gmysql.cur.execute("""SELECT * FROM usersrfid WHERE serial1 = %s  OR serial2 = %s AND HoraIni < NOW() AND HoraEnd > NOW() AND endDate > %s""",(serial,serial,today,))
        if (section == 1):
 
            print "(Autorizado)"
            time.sleep(0.1)
 
        else:
 
            print "(Caducado)"
            time.sleep(0.1)
 
	else:
        print "(Denegado)"
        time.sleep(0.1)

Alguna idea...?
Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

SELECT CON HORA DEL SISTEMA

Publicado por Leonardo Josué (414 intervenciones) el 15/02/2018 16:44:40
Hola Carlos:

Mucho ojo, en tu condición WHERE estás mezclando operadores tipo OR y tipo AND sin hacer uso de paréntesis y eso puede traerte problemas.

En matemáticas, la suma y la multiplicación tienen una JERARQUÍA DISTINTA, por lo tanto, la multiplicación se hace PRIMERO que la suma, en otras palabras:

1
1 + 2 * 3 = 7

esto quiere decir que primero se hace la multiplicación (2*3) y al resultado se le suma 1... si quieres que se ejecute primero la suma, entonces tienes que hacer uso de PARENTESIS para alterar la jerarquía de las operaciones:

1
(1 + 2) * 3 = 9

Esto mismo pasa con el AND y el OR, ya que el AND al igual que la multiplicación de ejecuta primero que el OR, en otras palabras, no es lo mismo que pongas:

1
2
3
4
5
6
7
8
SELECT *
FROM usersrfid
WHERE
serial1 = %s
OR serial2 = %s
AND HoraIni < NOW()
AND HoraEnd > NOW()
AND endDate > %s

a que pongas

1
2
3
4
5
6
7
8
SELECT *
FROM usersrfid
WHERE
(serial1 = %s
OR serial2 = %s)
AND HoraIni < NOW()
AND HoraEnd > NOW()
AND endDate > %s

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 7
Ha aumentado su posición en 8 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

SELECT CON HORA DEL SISTEMA

Publicado por CARLOS (4 intervenciones) el 18/02/2018 19:58:25
Gracias Leo, lo pruebo y te digo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 7
Ha aumentado su posición en 8 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

SELECT CON HORA DEL SISTEMA

Publicado por CARLOS (4 intervenciones) el 19/02/2018 14:01:10
Pues en principio funciona. Estaba empezando a desesperar, je, je...
Muchisimas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar