Oracle - Restriccion de Hora

   
Vista:

Restriccion de Hora

Publicado por Hersain Perea Amigon (1 intervención) el 12/06/2015 14:51:29
Muy buenos días, este es mi código, lo que quiero saber es como hago una restricción tipo check para que la Hora_ini no sea menor a las 6:00 y la Hora fin no sea, Mayor a 21:00, agradecería mucho su ayuda

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Create table Hora_Actividades (
DNI_Actividad		 Varchar(4)	    not null,
DNI_monitor		         Integer		    not null,
Fecha			        date	            not null,
Sala			        Varchar(20)      not null,
Hora_ini		               Sysdate		    not null,
Hora_fin		               Sysdate		    not null,
 
foreign key (DNI_Actividad) references Actividad(DNI_Actividad),
foreign key (DNI_monitor) references Monitor(DNI_monitor),
 
Constraint Hora_Act_PK primary key (DNI_Actividad, DNI_monitor),
 
check (Sala in ('Sala Multiusos 1','Sala Multiusos 2','Pabellón polideportivo','Sala Musculacion')),
);
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

Restriccion de Hora

Publicado por Rafael (177 intervenciones) el 19/06/2015 08:48:35
Varios temas ...

Estas en un foro de ORACLE, por lo cual hay ciertas cosas que de entrada veo MAL.

1. Los tipos varchar no son recomendados nunca para ORACLE, que usa los tipos VARCHAR2.
2. El tipo SYSDATE no es valido, ya que SYSDATE te devuelve la fecha y hora del sistema, es una funcion y una palabra reservada...
3. Despues del check tienes una coma, lo que te marcara error al tratar de compilar.

Dicho lo cual me suena que la pregunta no viene al lugar indicado, pero si a pesar de ello es ORACLE lo que quieres te dire algunos otros detalles

Los tipos HORA no estan soportados de forma individual, por lo que te quedan algunas opciones:

Manejar tus horas como VARCHAR2
Para esto tu validacion seria algo asi, NO OBSTANTE aclaro que al ser un varchar requeriras de mas validaciones en codigo para la captura de la hora. Y NO ME PARECE del todo correcto, pero es una opcion.
1
2
3
4
5
6
7
8
9
10
11
Create table Hora_Actividades (
DNI_Actividad   Varchar2(4)  not null,
DNI_monitor     Integer      not null,
Fecha           date         not null,
Sala            Varchar2(20) not null,
Hora_ini        varchar2(5)  not null,
Hora_fin        varchar2(5)  not null,
Constraint Hora_Act_PK primary key (DNI_Actividad, DNI_monitor),
check (Sala in ('Sala Multiusos 1','Sala Multiusos 2','Pabellón polideportivo','Sala Musculacion')),
check (Hora_ini>'07:59' and Hora_fin<'21:00')
);

Incluir en tus horas la FECHA (me suena lo mas correcto) con lo cual tambien estaria sobrado el uso del campo fecha, y quedando algo como asi:
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE HORA_ACTIVIDADES (
    DNI_ACTIVIDAD   VARCHAR2(4)  NOT NULL,
    DNI_MONITOR     INTEGER      NOT NULL,
    SALA            VARCHAR2(20) NOT NULL,
    HORA_INI        DATE  DEFAULT SYSDATE NOT NULL,
    HORA_FIN        DATE  DEFAULT SYSDATE NOT NULL,
    CONSTRAINT HORA_ACT_PK PRIMARY KEY (DNI_ACTIVIDAD, DNI_MONITOR),
    CHECK (SALA IN ('Sala Multiusos 1','Sala Multiusos 2','Pabellón polideportivo','Sala Musculacion')),
    CHECK (    HORA_INI > TO_DATE(TO_CHAR(TRUNC(HORA_INI), 'DD/MM/YYYY') || ' 07:59:00', 'DD/MM/YYYY HH24:MI:SS')
           AND HORA_FIN < TO_DATE(TO_CHAR(TRUNC(HORA_FIN), 'DD/MM/YYYY') || ' 21:00:00', 'DD/MM/YYYY HH24:MI:SS'))
);

Como sea y anos contaras... saludos.
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