Devolver valores concretos

20/02/2009 - 15:51 por MhBeyle | Informe spam
Muy buenas tardes,

Espero que la siguiente pregunta no sea un embrollo... :)

Teniendo una tabla de horarios con un código único para cada hora, tal
que así:

01 08:00
02 08:05
03 08:10
04 08:15
05 08:20
06 08:25
07 08:30
08 08:35
09 08:40
10 08:45
11 08:50
12 08:55
13 09:00

¿Es posible devolver valores dependiento de un intervalo constante?
Según el usuario introduzca intervalos de 5, 10, 15, 20, 30 minutos,
los resultados devueltos variarán. Por ejemplo, si introduce 20, la
salida tendría que ser así:

01 08:00
05 08:20
09 08:40
13 09:00

¿Es posible hacer esto sin demasiado coste añadido desde SQL server?
Porque doy por sentado que es poco menos que imposible hacerlo desde
un SELECT normal y corriente y se hace necesario el uso de T-SQL.

Un saludo,

MhBeyle ___

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
20/02/2009 - 16:44 | Informe spam
Ve si esto te es de ayuda.

DECLARE @t TABLE (
[id] INT NOT NULL PRIMARY KEY,
dt DATETIME NOT NULL UNIQUE
);

INSERT INTO @t VALUES(01, '08:00');
INSERT INTO @t VALUES(02, '08:05');
INSERT INTO @t VALUES(03, '08:10');
INSERT INTO @t VALUES(04, '08:15');
INSERT INTO @t VALUES(05, '08:20');
INSERT INTO @t VALUES(06, '08:25');
INSERT INTO @t VALUES(07, '08:30');
INSERT INTO @t VALUES(08, '08:35');
INSERT INTO @t VALUES(09, '08:40');
INSERT INTO @t VALUES(10, '08:45');
INSERT INTO @t VALUES(11, '08:50');
INSERT INTO @t VALUES(12, '08:55');
INSERT INTO @t VALUES(13, '09:00');

DECLARE @int INT;

SET @int = 20;

SELECT *
FROM @t
WHERE DATEDIFF([minute], '19000101', dt) % @int = 0;
GO


AMB



"MhBeyle" wrote:

Muy buenas tardes,

Espero que la siguiente pregunta no sea un embrollo... :)

Teniendo una tabla de horarios con un código único para cada hora, tal
que así:

01 08:00
02 08:05
03 08:10
04 08:15
05 08:20
06 08:25
07 08:30
08 08:35
09 08:40
10 08:45
11 08:50
12 08:55
13 09:00

¿Es posible devolver valores dependiento de un intervalo constante?
Según el usuario introduzca intervalos de 5, 10, 15, 20, 30 minutos,
los resultados devueltos variarán. Por ejemplo, si introduce 20, la
salida tendría que ser así:

01 08:00
05 08:20
09 08:40
13 09:00

¿Es posible hacer esto sin demasiado coste añadido desde SQL server?
Porque doy por sentado que es poco menos que imposible hacerlo desde
un SELECT normal y corriente y se hace necesario el uso de T-SQL.

Un saludo,

MhBeyle ___

Respuesta Responder a este mensaje
#2 Alejandro Mesa
20/02/2009 - 16:48 | Informe spam
Si quieres que el resultado solo muestre hora / min, entonces usa la funcion
convert.

SELECT [id], CONVERT(CHAR(5), dt, 114) AS dt
FROM @t
WHERE DATEDIFF([minute], '19000101', dt) % @int = 0;


AMB

"Alejandro Mesa" wrote:

Ve si esto te es de ayuda.

DECLARE @t TABLE (
[id] INT NOT NULL PRIMARY KEY,
dt DATETIME NOT NULL UNIQUE
);

INSERT INTO @t VALUES(01, '08:00');
INSERT INTO @t VALUES(02, '08:05');
INSERT INTO @t VALUES(03, '08:10');
INSERT INTO @t VALUES(04, '08:15');
INSERT INTO @t VALUES(05, '08:20');
INSERT INTO @t VALUES(06, '08:25');
INSERT INTO @t VALUES(07, '08:30');
INSERT INTO @t VALUES(08, '08:35');
INSERT INTO @t VALUES(09, '08:40');
INSERT INTO @t VALUES(10, '08:45');
INSERT INTO @t VALUES(11, '08:50');
INSERT INTO @t VALUES(12, '08:55');
INSERT INTO @t VALUES(13, '09:00');

DECLARE @int INT;

SET @int = 20;

SELECT *
FROM @t
WHERE DATEDIFF([minute], '19000101', dt) % @int = 0;
GO


AMB



"MhBeyle" wrote:

> Muy buenas tardes,
>
> Espero que la siguiente pregunta no sea un embrollo... :)
>
> Teniendo una tabla de horarios con un código único para cada hora, tal
> que así:
>
> 01 08:00
> 02 08:05
> 03 08:10
> 04 08:15
> 05 08:20
> 06 08:25
> 07 08:30
> 08 08:35
> 09 08:40
> 10 08:45
> 11 08:50
> 12 08:55
> 13 09:00
>
> ¿Es posible devolver valores dependiento de un intervalo constante?
> Según el usuario introduzca intervalos de 5, 10, 15, 20, 30 minutos,
> los resultados devueltos variarán. Por ejemplo, si introduce 20, la
> salida tendría que ser así:
>
> 01 08:00
> 05 08:20
> 09 08:40
> 13 09:00
>
> ¿Es posible hacer esto sin demasiado coste añadido desde SQL server?
> Porque doy por sentado que es poco menos que imposible hacerlo desde
> un SELECT normal y corriente y se hace necesario el uso de T-SQL.
>
> Un saludo,
>
> MhBeyle ___
>
Respuesta Responder a este mensaje
#3 MhBeyle
20/02/2009 - 18:50 | Informe spam
Enhorabuena por la respuesta. Denota un dominio del lenguaje muy
avanzado. Muchas gracias por tu interés.

Sin querer abusar de tu confianza, hago dos pequeños comentarios para
conocer tu opinión al respecto:

. Los valores de la tabla correspondientes a las horas no son de tipo
DateTime si no que son VarChar con una longitud de 5 caracteres. He
comprobado la velocidad con uno y otro tipo de datos y no he notado
apenas diferencia ¿Es conveniente adaptar la tabla y convertir los
datos a un tipo DateTime? Aunque yo he mostrado un ejemplo con trece
valores, la tabla contiene un total de 288 registros (00:00 a 23:55),
pero ya digo que yo no he notado apenas diferencia de tiempo.

. La función DATEDIFF controla todos aquellos valores que, desde el
valor '19000101', se incrementan en un entero determinado (20 en el
ejemplo). Si tuvieramos la necesidad de controlar rangos horarios
¿Bastaría con sustituir dicho valor por el inicio de rango?
He probado con este ejemplo y parece que devuelve los valores de forma
correcta:

Declare @Rg1_In varchar(5)
Declare @Rg1_Out varchar(5)
Declare @Int1 varchar(3)

Set @Rg1_In = '08:30'
Set @Rg1_In = '09:30'
Set @Int1 = '20'

[...]
WHERE
(CAST ( dt AS DateTime ) BETWEEN @Rg1_In AND @Rg1_Out')
AND (DATEDIFF([minute], @Rg1_In, dt) % @Int1 = 0)

(O sin CAST, como te comentaba anteriormente)


Muchas gracias de nuevo y un saludo,

MhBeyle ___

Alejandro Mesa escribió lo
siguiente ...

Si quieres que el resultado solo muestre hora / min, entonces usa la funcion
convert.

SELECT [id], CONVERT(CHAR(5), dt, 114) AS dt
FROM @t
WHERE DATEDIFF([minute], '19000101', dt) % @int = 0;


AMB

"Alejandro Mesa" wrote:

Ve si esto te es de ayuda.

DECLARE @t TABLE (
[id] INT NOT NULL PRIMARY KEY,
dt DATETIME NOT NULL UNIQUE
);

INSERT INTO @t VALUES(01, '08:00');
INSERT INTO @t VALUES(02, '08:05');
INSERT INTO @t VALUES(03, '08:10');
INSERT INTO @t VALUES(04, '08:15');
INSERT INTO @t VALUES(05, '08:20');
INSERT INTO @t VALUES(06, '08:25');
INSERT INTO @t VALUES(07, '08:30');
INSERT INTO @t VALUES(08, '08:35');
INSERT INTO @t VALUES(09, '08:40');
INSERT INTO @t VALUES(10, '08:45');
INSERT INTO @t VALUES(11, '08:50');
INSERT INTO @t VALUES(12, '08:55');
INSERT INTO @t VALUES(13, '09:00');

DECLARE @int INT;

SET @int = 20;

SELECT *
FROM @t
WHERE DATEDIFF([minute], '19000101', dt) % @int = 0;
GO


AMB



"MhBeyle" wrote:

> Muy buenas tardes,
>
> Espero que la siguiente pregunta no sea un embrollo... :)
>
> Teniendo una tabla de horarios con un código único para cada hora, tal
> que así:
>
> 01 08:00
> 02 08:05
> 03 08:10
> 04 08:15
> 05 08:20
> 06 08:25
> 07 08:30
> 08 08:35
> 09 08:40
> 10 08:45
> 11 08:50
> 12 08:55
> 13 09:00
>
> ¿Es posible devolver valores dependiento de un intervalo constante?
> Según el usuario introduzca intervalos de 5, 10, 15, 20, 30 minutos,
> los resultados devueltos variarán. Por ejemplo, si introduce 20, la
> salida tendría que ser así:
>
> 01 08:00
> 05 08:20
> 09 08:40
> 13 09:00
>
> ¿Es posible hacer esto sin demasiado coste añadido desde SQL server?
> Porque doy por sentado que es poco menos que imposible hacerlo desde
> un SELECT normal y corriente y se hace necesario el uso de T-SQL.
>
> Un saludo,
>
> MhBeyle ___
>
Respuesta Responder a este mensaje
#4 Alejandro Mesa
20/02/2009 - 21:01 | Informe spam
MhBeyle,

.. Los valores de la tabla correspondientes a las horas no son de tipo
DateTime si no que son VarChar con una longitud de 5 caracteres. He
comprobado la velocidad con uno y otro tipo de datos y no he notado
apenas diferencia ¿Es conveniente adaptar la tabla y convertir los
datos a un tipo DateTime?



Depende que es lo que vas a hacer con esos valores, correcto?

Si los valores van a participar constantemente en funciones de datetime,
preferible que los tengas como datetime, asi ahorramos tener que estar
convirtiendo constantemente. La buena noticia es que ese formato "hh:mm" es
convertible implicitamente a datetime.

A partir de la version 2008 de SQL Server, contamos con el tipo de data TIME.

Declare @Rg1_In varchar(5)
Declare @Rg1_Out varchar(5)
Declare @Int1 varchar(3)

Set @Rg1_In = '08:30'
Set @Rg1_In = '09:30'
Set @Int1 = '20'

[...]
WHERE
(CAST ( dt AS DateTime ) BETWEEN @Rg1_In AND @Rg1_Out')
AND (DATEDIFF([minute], @Rg1_In, dt) % @Int1 = 0)



Por que defines el intervalo de minutos como caracteres, deberia ser un
entero.

Declare @Int1 int;

set @Int1 = 20;

...


AMB



"MhBeyle" wrote:

Enhorabuena por la respuesta. Denota un dominio del lenguaje muy
avanzado. Muchas gracias por tu interés.

Sin querer abusar de tu confianza, hago dos pequeños comentarios para
conocer tu opinión al respecto:

.. Los valores de la tabla correspondientes a las horas no son de tipo
DateTime si no que son VarChar con una longitud de 5 caracteres. He
comprobado la velocidad con uno y otro tipo de datos y no he notado
apenas diferencia ¿Es conveniente adaptar la tabla y convertir los
datos a un tipo DateTime? Aunque yo he mostrado un ejemplo con trece
valores, la tabla contiene un total de 288 registros (00:00 a 23:55),
pero ya digo que yo no he notado apenas diferencia de tiempo.

.. La función DATEDIFF controla todos aquellos valores que, desde el
valor '19000101', se incrementan en un entero determinado (20 en el
ejemplo). Si tuvieramos la necesidad de controlar rangos horarios
¿Bastaría con sustituir dicho valor por el inicio de rango?
He probado con este ejemplo y parece que devuelve los valores de forma
correcta:

Declare @Rg1_In varchar(5)
Declare @Rg1_Out varchar(5)
Declare @Int1 varchar(3)

Set @Rg1_In = '08:30'
Set @Rg1_In = '09:30'
Set @Int1 = '20'

[...]
WHERE
(CAST ( dt AS DateTime ) BETWEEN @Rg1_In AND @Rg1_Out')
AND (DATEDIFF([minute], @Rg1_In, dt) % @Int1 = 0)

(O sin CAST, como te comentaba anteriormente)


Muchas gracias de nuevo y un saludo,

MhBeyle ___

Alejandro Mesa escribió lo
siguiente ...

>Si quieres que el resultado solo muestre hora / min, entonces usa la funcion
>convert.
>
>SELECT [id], CONVERT(CHAR(5), dt, 114) AS dt
>FROM @t
>WHERE DATEDIFF([minute], '19000101', dt) % @int = 0;
>
>
>AMB
>
>"Alejandro Mesa" wrote:
>
>> Ve si esto te es de ayuda.
>>
>> DECLARE @t TABLE (
>> [id] INT NOT NULL PRIMARY KEY,
>> dt DATETIME NOT NULL UNIQUE
>> );
>>
>> INSERT INTO @t VALUES(01, '08:00');
>> INSERT INTO @t VALUES(02, '08:05');
>> INSERT INTO @t VALUES(03, '08:10');
>> INSERT INTO @t VALUES(04, '08:15');
>> INSERT INTO @t VALUES(05, '08:20');
>> INSERT INTO @t VALUES(06, '08:25');
>> INSERT INTO @t VALUES(07, '08:30');
>> INSERT INTO @t VALUES(08, '08:35');
>> INSERT INTO @t VALUES(09, '08:40');
>> INSERT INTO @t VALUES(10, '08:45');
>> INSERT INTO @t VALUES(11, '08:50');
>> INSERT INTO @t VALUES(12, '08:55');
>> INSERT INTO @t VALUES(13, '09:00');
>>
>> DECLARE @int INT;
>>
>> SET @int = 20;
>>
>> SELECT *
>> FROM @t
>> WHERE DATEDIFF([minute], '19000101', dt) % @int = 0;
>> GO
>>
>>
>> AMB
>>
>>
>>
>> "MhBeyle" wrote:
>>
>> > Muy buenas tardes,
>> >
>> > Espero que la siguiente pregunta no sea un embrollo... :)
>> >
>> > Teniendo una tabla de horarios con un código único para cada hora, tal
>> > que así:
>> >
>> > 01 08:00
>> > 02 08:05
>> > 03 08:10
>> > 04 08:15
>> > 05 08:20
>> > 06 08:25
>> > 07 08:30
>> > 08 08:35
>> > 09 08:40
>> > 10 08:45
>> > 11 08:50
>> > 12 08:55
>> > 13 09:00
>> >
>> > ¿Es posible devolver valores dependiento de un intervalo constante?
>> > Según el usuario introduzca intervalos de 5, 10, 15, 20, 30 minutos,
>> > los resultados devueltos variarán. Por ejemplo, si introduce 20, la
>> > salida tendría que ser así:
>> >
>> > 01 08:00
>> > 05 08:20
>> > 09 08:40
>> > 13 09:00
>> >
>> > ¿Es posible hacer esto sin demasiado coste añadido desde SQL server?
>> > Porque doy por sentado que es poco menos que imposible hacerlo desde
>> > un SELECT normal y corriente y se hace necesario el uso de T-SQL.
>> >
>> > Un saludo,
>> >
>> > MhBeyle ___
>> >

Respuesta Responder a este mensaje
#5 Jose Mariano Alvarez
23/02/2009 - 02:08 | Informe spam
Aprovechando la idea del where de Alejandro podrias modificar tu tabla para
tener algo como esto

COD Hora M05 M10 M15 M20
01 08:00 1 1 1 1
02 08:05 1 0 0 0
03 08:10 1 1 0 0
04 08:15 1 0 1 0
05 08:20 1 1 0 1
06 08:25 1 0 0 0
07 08:30 1 1 1 0
08 08:35 1 0 0 0
09 08:40 1 1 0 1
10 08:45 1 0 1 0
11 08:50 1 1 0 0
12 08:55 1 0 0 0
13 09:00 1 1 1 1

Luego podrias usar la columna que corresponde y los calculos solo los haces
una vez.
Si aun quieres mas rendimiento podrias agregar indices.


Saludos


Ing. Jose Mariano Alvarez
SQLTotal Consulting

(Cambia los ceros por O y saca lo que sobra)

Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase. Por
favor tratar de indicar la versión de SQL y Service Pack. La inclusión de
(CREATE, INSERTS, etc.) para poder reproducir el problema también ayuda.










"Alejandro Mesa" wrote in message
news:
MhBeyle,

.. Los valores de la tabla correspondientes a las horas no son de tipo
DateTime si no que son VarChar con una longitud de 5 caracteres. He
comprobado la velocidad con uno y otro tipo de datos y no he notado
apenas diferencia ¿Es conveniente adaptar la tabla y convertir los
datos a un tipo DateTime?



Depende que es lo que vas a hacer con esos valores, correcto?

Si los valores van a participar constantemente en funciones de datetime,
preferible que los tengas como datetime, asi ahorramos tener que estar
convirtiendo constantemente. La buena noticia es que ese formato "hh:mm"
es
convertible implicitamente a datetime.

A partir de la version 2008 de SQL Server, contamos con el tipo de data
TIME.

Declare @Rg1_In varchar(5)
Declare @Rg1_Out varchar(5)
Declare @Int1 varchar(3)

Set @Rg1_In = '08:30'
Set @Rg1_In = '09:30'
Set @Int1 = '20'

[...]
WHERE
(CAST ( dt AS DateTime ) BETWEEN @Rg1_In AND @Rg1_Out')
AND (DATEDIFF([minute], @Rg1_In, dt) % @Int1 = 0)



Por que defines el intervalo de minutos como caracteres, deberia ser un
entero.

Declare @Int1 int;

set @Int1 = 20;

...


AMB



"MhBeyle" wrote:

Enhorabuena por la respuesta. Denota un dominio del lenguaje muy
avanzado. Muchas gracias por tu interés.

Sin querer abusar de tu confianza, hago dos pequeños comentarios para
conocer tu opinión al respecto:

.. Los valores de la tabla correspondientes a las horas no son de tipo
DateTime si no que son VarChar con una longitud de 5 caracteres. He
comprobado la velocidad con uno y otro tipo de datos y no he notado
apenas diferencia ¿Es conveniente adaptar la tabla y convertir los
datos a un tipo DateTime? Aunque yo he mostrado un ejemplo con trece
valores, la tabla contiene un total de 288 registros (00:00 a 23:55),
pero ya digo que yo no he notado apenas diferencia de tiempo.

.. La función DATEDIFF controla todos aquellos valores que, desde el
valor '19000101', se incrementan en un entero determinado (20 en el
ejemplo). Si tuvieramos la necesidad de controlar rangos horarios
¿Bastaría con sustituir dicho valor por el inicio de rango?
He probado con este ejemplo y parece que devuelve los valores de forma
correcta:

Declare @Rg1_In varchar(5)
Declare @Rg1_Out varchar(5)
Declare @Int1 varchar(3)

Set @Rg1_In = '08:30'
Set @Rg1_In = '09:30'
Set @Int1 = '20'

[...]
WHERE
(CAST ( dt AS DateTime ) BETWEEN @Rg1_In AND @Rg1_Out')
AND (DATEDIFF([minute], @Rg1_In, dt) % @Int1 = 0)

(O sin CAST, como te comentaba anteriormente)


Muchas gracias de nuevo y un saludo,

MhBeyle ___

Alejandro Mesa escribió lo
siguiente ...

>Si quieres que el resultado solo muestre hora / min, entonces usa la
>funcion
>convert.
>
>SELECT [id], CONVERT(CHAR(5), dt, 114) AS dt
>FROM @t
>WHERE DATEDIFF([minute], '19000101', dt) % @int = 0;
>
>
>AMB
>
>"Alejandro Mesa" wrote:
>
>> Ve si esto te es de ayuda.
>>
>> DECLARE @t TABLE (
>> [id] INT NOT NULL PRIMARY KEY,
>> dt DATETIME NOT NULL UNIQUE
>> );
>>
>> INSERT INTO @t VALUES(01, '08:00');
>> INSERT INTO @t VALUES(02, '08:05');
>> INSERT INTO @t VALUES(03, '08:10');
>> INSERT INTO @t VALUES(04, '08:15');
>> INSERT INTO @t VALUES(05, '08:20');
>> INSERT INTO @t VALUES(06, '08:25');
>> INSERT INTO @t VALUES(07, '08:30');
>> INSERT INTO @t VALUES(08, '08:35');
>> INSERT INTO @t VALUES(09, '08:40');
>> INSERT INTO @t VALUES(10, '08:45');
>> INSERT INTO @t VALUES(11, '08:50');
>> INSERT INTO @t VALUES(12, '08:55');
>> INSERT INTO @t VALUES(13, '09:00');
>>
>> DECLARE @int INT;
>>
>> SET @int = 20;
>>
>> SELECT *
>> FROM @t
>> WHERE DATEDIFF([minute], '19000101', dt) % @int = 0;
>> GO
>>
>>
>> AMB
>>
>>
>>
>> "MhBeyle" wrote:
>>
>> > Muy buenas tardes,
>> >
>> > Espero que la siguiente pregunta no sea un embrollo... :)
>> >
>> > Teniendo una tabla de horarios con un código único para cada hora,
>> > tal
>> > que así:
>> >
>> > 01 08:00
>> > 02 08:05
>> > 03 08:10
>> > 04 08:15
>> > 05 08:20
>> > 06 08:25
>> > 07 08:30
>> > 08 08:35
>> > 09 08:40
>> > 10 08:45
>> > 11 08:50
>> > 12 08:55
>> > 13 09:00
>> >
>> > ¿Es posible devolver valores dependiento de un intervalo constante?
>> > Según el usuario introduzca intervalos de 5, 10, 15, 20, 30 minutos,
>> > los resultados devueltos variarán. Por ejemplo, si introduce 20, la
>> > salida tendría que ser así:
>> >
>> > 01 08:00
>> > 05 08:20
>> > 09 08:40
>> > 13 09:00
>> >
>> > ¿Es posible hacer esto sin demasiado coste añadido desde SQL server?
>> > Porque doy por sentado que es poco menos que imposible hacerlo desde
>> > un SELECT normal y corriente y se hace necesario el uso de T-SQL.
>> >
>> > Un saludo,
>> >
>> > MhBeyle ___
>> >

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida