Problemas con consulta

24/05/2005 - 10:51 por blackpower | Informe spam
Buenos dias,

Tengo una consulta que me devuelve:

Tienda HoraInicio HoraFin
Prica 10:20 14:10
Caprabo 11:20
Esquina 11:10 18:29
Fitó as 13:45

El problema es que quien diseñó la BD creó esos campos de hora en un
varchar!

Ahora tengo que hacer una consulta que me devuelva las tiendas que en el
momento de hacer las consultas esté abierta... He pensado en:

SELECT
horaInicio,
nombreTienda

FROM tiendas
WHERE isdate(horaInicio)=1
AND cast(horaInicio as datetime)>=getdate()

Esta consulta "peta" por el cast: Error de sintaxis al convertir una cadena
de caracteres a datetime.


Existe alguna forma de sacar esta consulta?


Gracias de antemano y saludos,

Xus.

Preguntas similare

Leer las respuestas

#6 xus
24/05/2005 - 17:53 | Informe spam
nada nada, esa consulta es impresionante,

y el performance ya se pierde por el simple hecho que esas columnas son
texto en vez de fechas y hay que andar haciendo conversiones...

soys unos cracks, gracias a todos!

Y un saludo,

Xus.

"Maxi" escribió en el mensaje
news:
jaja, y ni hablar de la performance no ;)


Salu2
Maxi


"Alejandro Mesa" escribió en el
mensaje news:
Lo que debemos de asegurarnos es de seleccionar las filas donde estos
campos
tengan el formato hh:mm y usar la parte de la fecha de la misma funcion
getdate().

Ejemplo:

use northwind
go

create table t1 (
Tienda varchar(25),
HoraInicio char(5),
HoraFin char(5)
)
go

insert into t1 values('Prica', '10:20', '14:10')
insert into t1 values('Caprabo', null, '11:20')
insert into t1 values('Esquina', '11:10', '18:29')
insert into t1 values('Fitó', 'as', '13:45')
go

select
Tienda, HoraInicio, HoraFin
from
t1
where
getdate() between
case
when HoraInicio like '[0-9][0-9]:[0-9][0-9]' then convert(char(10),
getdate(), 126)
else null
end + 'T' + HoraInicio + ':00'
and
case
when coalesce(HoraFin, right(convert(char(16), getdate(), 126), 5)) like
'[0-9][0-9]:[0-9][0-9]' then convert(char(10), getdate(), 126)
else null
end + 'T' + coalesce(HoraFin + ':' + right('0' + ltrim(datepart(second,
getdate())), 2), right(convert(char(19), getdate(), 126), 8))
go

drop table t1
go

Si la HoraInicio tiene formato 'hh:mm' entonces arma la fecha de inicio
como
la parte de la fecha de la funcion getdate() , la cual seria
"2005-05-24", y
adicionale 'T', HoraInicio y ':00' segundos. Si HoraFin (en caso de que
HoraFin sea null, entonces usamos la hora y los minutos de la funcion
getdate()) tiene formato 'hh:mm' entonces armamos la fecha final como la
parte de la fecha de la funcion getdate() , la cual seria "2005-05-24", y
le
adicionamos 'T', HoraFin (en caso de que HoraFin sea null, entonces
usamos la
hora, los minutos y los segundos de la funcion getdate()) mas los
segundos de
la funcion getdate().

Un trabalenguas verdad?, eso es lo que pasa cuando no usamos el tipo de
datos correcto para almacenar data en nuestra bd.


AMB

"blackpower" wrote:

Buenos dias,

Tengo una consulta que me devuelve:

Tienda HoraInicio HoraFin
Prica 10:20 14:10
Caprabo 11:20
Esquina 11:10 18:29
Fitó as 13:45

El problema es que quien diseñó la BD creó esos campos de hora en un
varchar!

Ahora tengo que hacer una consulta que me devuelva las tiendas que en el
momento de hacer las consultas esté abierta... He pensado en:

SELECT
horaInicio,
nombreTienda

FROM tiendas
WHERE isdate(horaInicio)=1
AND cast(horaInicio as datetime)>=getdate()

Esta consulta "peta" por el cast: Error de sintaxis al convertir una
cadena
de caracteres a datetime.


Existe alguna forma de sacar esta consulta?


Gracias de antemano y saludos,

Xus.










Respuesta Responder a este mensaje
#7 xus
24/05/2005 - 18:11 | Informe spam
bueno, ahun así, me he arriesgado y he convertido los campos a smalldatetime
y me ha conservado sus valores!! (eso si, con año 1900, pero eso...)

Saludos,

Xus.


"xus" escribió en el mensaje
news:%
nada nada, esa consulta es impresionante,

y el performance ya se pierde por el simple hecho que esas columnas son
texto en vez de fechas y hay que andar haciendo conversiones...

soys unos cracks, gracias a todos!

Y un saludo,

Xus.

"Maxi" escribió en el mensaje
news:
jaja, y ni hablar de la performance no ;)


Salu2
Maxi


"Alejandro Mesa" escribió en el
mensaje news:
Lo que debemos de asegurarnos es de seleccionar las filas donde estos
campos
tengan el formato hh:mm y usar la parte de la fecha de la misma funcion
getdate().

Ejemplo:

use northwind
go

create table t1 (
Tienda varchar(25),
HoraInicio char(5),
HoraFin char(5)
)
go

insert into t1 values('Prica', '10:20', '14:10')
insert into t1 values('Caprabo', null, '11:20')
insert into t1 values('Esquina', '11:10', '18:29')
insert into t1 values('Fitó', 'as', '13:45')
go

select
Tienda, HoraInicio, HoraFin
from
t1
where
getdate() between
case
when HoraInicio like '[0-9][0-9]:[0-9][0-9]' then convert(char(10),
getdate(), 126)
else null
end + 'T' + HoraInicio + ':00'
and
case
when coalesce(HoraFin, right(convert(char(16), getdate(), 126), 5)) like
'[0-9][0-9]:[0-9][0-9]' then convert(char(10), getdate(), 126)
else null
end + 'T' + coalesce(HoraFin + ':' + right('0' + ltrim(datepart(second,
getdate())), 2), right(convert(char(19), getdate(), 126), 8))
go

drop table t1
go

Si la HoraInicio tiene formato 'hh:mm' entonces arma la fecha de inicio
como
la parte de la fecha de la funcion getdate() , la cual seria
"2005-05-24", y
adicionale 'T', HoraInicio y ':00' segundos. Si HoraFin (en caso de que
HoraFin sea null, entonces usamos la hora y los minutos de la funcion
getdate()) tiene formato 'hh:mm' entonces armamos la fecha final como la
parte de la fecha de la funcion getdate() , la cual seria "2005-05-24",
y le
adicionamos 'T', HoraFin (en caso de que HoraFin sea null, entonces
usamos la
hora, los minutos y los segundos de la funcion getdate()) mas los
segundos de
la funcion getdate().

Un trabalenguas verdad?, eso es lo que pasa cuando no usamos el tipo de
datos correcto para almacenar data en nuestra bd.


AMB

"blackpower" wrote:

Buenos dias,

Tengo una consulta que me devuelve:

Tienda HoraInicio HoraFin
Prica 10:20 14:10
Caprabo 11:20
Esquina 11:10 18:29
Fitó as 13:45

El problema es que quien diseñó la BD creó esos campos de hora en un
varchar!

Ahora tengo que hacer una consulta que me devuelva las tiendas que en
el
momento de hacer las consultas esté abierta... He pensado en:

SELECT
horaInicio,
nombreTienda

FROM tiendas
WHERE isdate(horaInicio)=1
AND cast(horaInicio as datetime)>=getdate()

Esta consulta "peta" por el cast: Error de sintaxis al convertir una
cadena
de caracteres a datetime.


Existe alguna forma de sacar esta consulta?


Gracias de antemano y saludos,

Xus.














Respuesta Responder a este mensaje
#8 Alejandro Mesa
24/05/2005 - 18:38 | Informe spam
Pues ahora puedes usar algo asi como:

declare @d datetime

set @d = cast('1900-01-01T' + right(convert(varchar(25), getdate(), 126),
12) as datetime)

...
where
HoraInicio <= @d
and (HoraFin > @d or HoraFin is null)

Mucho mas claro, no?


AMB

"xus" wrote:

bueno, ahun así, me he arriesgado y he convertido los campos a smalldatetime
y me ha conservado sus valores!! (eso si, con año 1900, pero eso...)

Saludos,

Xus.


"xus" escribió en el mensaje
news:%
> nada nada, esa consulta es impresionante,
>
> y el performance ya se pierde por el simple hecho que esas columnas son
> texto en vez de fechas y hay que andar haciendo conversiones...
>
> soys unos cracks, gracias a todos!
>
> Y un saludo,
>
> Xus.
>
> "Maxi" escribió en el mensaje
> news:
>> jaja, y ni hablar de la performance no ;)
>>
>>
>> Salu2
>> Maxi
>>
>>
>> "Alejandro Mesa" escribió en el
>> mensaje news:
>>> Lo que debemos de asegurarnos es de seleccionar las filas donde estos
>>> campos
>>> tengan el formato hh:mm y usar la parte de la fecha de la misma funcion
>>> getdate().
>>>
>>> Ejemplo:
>>>
>>> use northwind
>>> go
>>>
>>> create table t1 (
>>> Tienda varchar(25),
>>> HoraInicio char(5),
>>> HoraFin char(5)
>>> )
>>> go
>>>
>>> insert into t1 values('Prica', '10:20', '14:10')
>>> insert into t1 values('Caprabo', null, '11:20')
>>> insert into t1 values('Esquina', '11:10', '18:29')
>>> insert into t1 values('Fitó', 'as', '13:45')
>>> go
>>>
>>> select
>>> Tienda, HoraInicio, HoraFin
>>> from
>>> t1
>>> where
>>> getdate() between
>>> case
>>> when HoraInicio like '[0-9][0-9]:[0-9][0-9]' then convert(char(10),
>>> getdate(), 126)
>>> else null
>>> end + 'T' + HoraInicio + ':00'
>>> and
>>> case
>>> when coalesce(HoraFin, right(convert(char(16), getdate(), 126), 5)) like
>>> '[0-9][0-9]:[0-9][0-9]' then convert(char(10), getdate(), 126)
>>> else null
>>> end + 'T' + coalesce(HoraFin + ':' + right('0' + ltrim(datepart(second,
>>> getdate())), 2), right(convert(char(19), getdate(), 126), 8))
>>> go
>>>
>>> drop table t1
>>> go
>>>
>>> Si la HoraInicio tiene formato 'hh:mm' entonces arma la fecha de inicio
>>> como
>>> la parte de la fecha de la funcion getdate() , la cual seria
>>> "2005-05-24", y
>>> adicionale 'T', HoraInicio y ':00' segundos. Si HoraFin (en caso de que
>>> HoraFin sea null, entonces usamos la hora y los minutos de la funcion
>>> getdate()) tiene formato 'hh:mm' entonces armamos la fecha final como la
>>> parte de la fecha de la funcion getdate() , la cual seria "2005-05-24",
>>> y le
>>> adicionamos 'T', HoraFin (en caso de que HoraFin sea null, entonces
>>> usamos la
>>> hora, los minutos y los segundos de la funcion getdate()) mas los
>>> segundos de
>>> la funcion getdate().
>>>
>>> Un trabalenguas verdad?, eso es lo que pasa cuando no usamos el tipo de
>>> datos correcto para almacenar data en nuestra bd.
>>>
>>>
>>> AMB
>>>
>>> "blackpower" wrote:
>>>
>>>> Buenos dias,
>>>>
>>>> Tengo una consulta que me devuelve:
>>>>
>>>> Tienda HoraInicio HoraFin
>>>> Prica 10:20 14:10
>>>> Caprabo 11:20
>>>> Esquina 11:10 18:29
>>>> Fitó as 13:45
>>>>
>>>> El problema es que quien diseñó la BD creó esos campos de hora en un
>>>> varchar!
>>>>
>>>> Ahora tengo que hacer una consulta que me devuelva las tiendas que en
>>>> el
>>>> momento de hacer las consultas esté abierta... He pensado en:
>>>>
>>>> SELECT
>>>> horaInicio,
>>>> nombreTienda
>>>>
>>>> FROM tiendas
>>>> WHERE isdate(horaInicio)=1
>>>> AND cast(horaInicio as datetime)>=getdate()
>>>>
>>>> Esta consulta "peta" por el cast: Error de sintaxis al convertir una
>>>> cadena
>>>> de caracteres a datetime.
>>>>
>>>>
>>>> Existe alguna forma de sacar esta consulta?
>>>>
>>>>
>>>> Gracias de antemano y saludos,
>>>>
>>>> Xus.
>>>>
>>>>
>>>>
>>>>
>>
>>
>
>



Respuesta Responder a este mensaje
#9 Eleazar
24/05/2005 - 19:07 | Informe spam
..y que onda con blackpower si se convencio, a donde se fue? igual y lo
dejaron peor

"Alejandro Mesa" escribió en el
mensaje news:
Pues ahora puedes usar algo asi como:

declare @d datetime

set @d = cast('1900-01-01T' + right(convert(varchar(25), getdate(), 126),
12) as datetime)

...
where
HoraInicio <= @d
and (HoraFin > @d or HoraFin is null)

Mucho mas claro, no?


AMB

"xus" wrote:

> bueno, ahun así, me he arriesgado y he convertido los campos a


smalldatetime
> y me ha conservado sus valores!! (eso si, con año 1900, pero eso...)
>
> Saludos,
>
> Xus.
>
>
> "xus" escribió en el mensaje
> news:%
> > nada nada, esa consulta es impresionante,
> >
> > y el performance ya se pierde por el simple hecho que esas columnas


son
> > texto en vez de fechas y hay que andar haciendo conversiones...
> >
> > soys unos cracks, gracias a todos!
> >
> > Y un saludo,
> >
> > Xus.
> >
> > "Maxi" escribió en el mensaje
> > news:
> >> jaja, y ni hablar de la performance no ;)
> >>
> >>
> >> Salu2
> >> Maxi
> >>
> >>
> >> "Alejandro Mesa" escribió


en el
> >> mensaje news:
> >>> Lo que debemos de asegurarnos es de seleccionar las filas donde


estos
> >>> campos
> >>> tengan el formato hh:mm y usar la parte de la fecha de la misma


funcion
> >>> getdate().
> >>>
> >>> Ejemplo:
> >>>
> >>> use northwind
> >>> go
> >>>
> >>> create table t1 (
> >>> Tienda varchar(25),
> >>> HoraInicio char(5),
> >>> HoraFin char(5)
> >>> )
> >>> go
> >>>
> >>> insert into t1 values('Prica', '10:20', '14:10')
> >>> insert into t1 values('Caprabo', null, '11:20')
> >>> insert into t1 values('Esquina', '11:10', '18:29')
> >>> insert into t1 values('Fitó', 'as', '13:45')
> >>> go
> >>>
> >>> select
> >>> Tienda, HoraInicio, HoraFin
> >>> from
> >>> t1
> >>> where
> >>> getdate() between
> >>> case
> >>> when HoraInicio like '[0-9][0-9]:[0-9][0-9]' then convert(char(10),
> >>> getdate(), 126)
> >>> else null
> >>> end + 'T' + HoraInicio + ':00'
> >>> and
> >>> case
> >>> when coalesce(HoraFin, right(convert(char(16), getdate(), 126), 5))


like
> >>> '[0-9][0-9]:[0-9][0-9]' then convert(char(10), getdate(), 126)
> >>> else null
> >>> end + 'T' + coalesce(HoraFin + ':' + right('0' +


ltrim(datepart(second,
> >>> getdate())), 2), right(convert(char(19), getdate(), 126), 8))
> >>> go
> >>>
> >>> drop table t1
> >>> go
> >>>
> >>> Si la HoraInicio tiene formato 'hh:mm' entonces arma la fecha de


inicio
> >>> como
> >>> la parte de la fecha de la funcion getdate() , la cual seria
> >>> "2005-05-24", y
> >>> adicionale 'T', HoraInicio y ':00' segundos. Si HoraFin (en caso de


que
> >>> HoraFin sea null, entonces usamos la hora y los minutos de la


funcion
> >>> getdate()) tiene formato 'hh:mm' entonces armamos la fecha final


como la
> >>> parte de la fecha de la funcion getdate() , la cual seria


"2005-05-24",
> >>> y le
> >>> adicionamos 'T', HoraFin (en caso de que HoraFin sea null, entonces
> >>> usamos la
> >>> hora, los minutos y los segundos de la funcion getdate()) mas los
> >>> segundos de
> >>> la funcion getdate().
> >>>
> >>> Un trabalenguas verdad?, eso es lo que pasa cuando no usamos el tipo


de
> >>> datos correcto para almacenar data en nuestra bd.
> >>>
> >>>
> >>> AMB
> >>>
> >>> "blackpower" wrote:
> >>>
> >>>> Buenos dias,
> >>>>
> >>>> Tengo una consulta que me devuelve:
> >>>>
> >>>> Tienda HoraInicio HoraFin
> >>>> Prica 10:20 14:10
> >>>> Caprabo 11:20
> >>>> Esquina 11:10 18:29
> >>>> Fitó as 13:45
> >>>>
> >>>> El problema es que quien diseñó la BD creó esos campos de hora en


un
> >>>> varchar!
> >>>>
> >>>> Ahora tengo que hacer una consulta que me devuelva las tiendas que


en
> >>>> el
> >>>> momento de hacer las consultas esté abierta... He pensado en:
> >>>>
> >>>> SELECT
> >>>> horaInicio,
> >>>> nombreTienda
> >>>>
> >>>> FROM tiendas
> >>>> WHERE isdate(horaInicio)=1
> >>>> AND cast(horaInicio as datetime)>=getdate()
> >>>>
> >>>> Esta consulta "peta" por el cast: Error de sintaxis al convertir


una
> >>>> cadena
> >>>> de caracteres a datetime.
> >>>>
> >>>>
> >>>> Existe alguna forma de sacar esta consulta?
> >>>>
> >>>>
> >>>> Gracias de antemano y saludos,
> >>>>
> >>>> Xus.
> >>>>
> >>>>
> >>>>
> >>>>
> >>
> >>
> >
> >
>
>
>
Respuesta Responder a este mensaje
#10 xus
25/05/2005 - 16:30 | Informe spam
no me he muerto hombre, pero ya se da por zanjado ;)

gracias,

xus.

"Eleazar" escribió en el mensaje
news:
..y que onda con blackpower si se convencio, a donde se fue? igual y lo
dejaron peor

"Alejandro Mesa" escribió en el
mensaje news:
Pues ahora puedes usar algo asi como:

declare @d datetime

set @d = cast('1900-01-01T' + right(convert(varchar(25), getdate(), 126),
12) as datetime)

...
where
HoraInicio <= @d
and (HoraFin > @d or HoraFin is null)

Mucho mas claro, no?


AMB

"xus" wrote:

> bueno, ahun así, me he arriesgado y he convertido los campos a


smalldatetime
> y me ha conservado sus valores!! (eso si, con año 1900, pero eso...)
>
> Saludos,
>
> Xus.
>
>
> "xus" escribió en el mensaje
> news:%
> > nada nada, esa consulta es impresionante,
> >
> > y el performance ya se pierde por el simple hecho que esas columnas


son
> > texto en vez de fechas y hay que andar haciendo conversiones...
> >
> > soys unos cracks, gracias a todos!
> >
> > Y un saludo,
> >
> > Xus.
> >
> > "Maxi" escribió en el mensaje
> > news:
> >> jaja, y ni hablar de la performance no ;)
> >>
> >>
> >> Salu2
> >> Maxi
> >>
> >>
> >> "Alejandro Mesa" escribió


en el
> >> mensaje news:
> >>> Lo que debemos de asegurarnos es de seleccionar las filas donde


estos
> >>> campos
> >>> tengan el formato hh:mm y usar la parte de la fecha de la misma


funcion
> >>> getdate().
> >>>
> >>> Ejemplo:
> >>>
> >>> use northwind
> >>> go
> >>>
> >>> create table t1 (
> >>> Tienda varchar(25),
> >>> HoraInicio char(5),
> >>> HoraFin char(5)
> >>> )
> >>> go
> >>>
> >>> insert into t1 values('Prica', '10:20', '14:10')
> >>> insert into t1 values('Caprabo', null, '11:20')
> >>> insert into t1 values('Esquina', '11:10', '18:29')
> >>> insert into t1 values('Fitó', 'as', '13:45')
> >>> go
> >>>
> >>> select
> >>> Tienda, HoraInicio, HoraFin
> >>> from
> >>> t1
> >>> where
> >>> getdate() between
> >>> case
> >>> when HoraInicio like '[0-9][0-9]:[0-9][0-9]' then convert(char(10),
> >>> getdate(), 126)
> >>> else null
> >>> end + 'T' + HoraInicio + ':00'
> >>> and
> >>> case
> >>> when coalesce(HoraFin, right(convert(char(16), getdate(), 126), 5))


like
> >>> '[0-9][0-9]:[0-9][0-9]' then convert(char(10), getdate(), 126)
> >>> else null
> >>> end + 'T' + coalesce(HoraFin + ':' + right('0' +


ltrim(datepart(second,
> >>> getdate())), 2), right(convert(char(19), getdate(), 126), 8))
> >>> go
> >>>
> >>> drop table t1
> >>> go
> >>>
> >>> Si la HoraInicio tiene formato 'hh:mm' entonces arma la fecha de


inicio
> >>> como
> >>> la parte de la fecha de la funcion getdate() , la cual seria
> >>> "2005-05-24", y
> >>> adicionale 'T', HoraInicio y ':00' segundos. Si HoraFin (en caso de


que
> >>> HoraFin sea null, entonces usamos la hora y los minutos de la


funcion
> >>> getdate()) tiene formato 'hh:mm' entonces armamos la fecha final


como la
> >>> parte de la fecha de la funcion getdate() , la cual seria


"2005-05-24",
> >>> y le
> >>> adicionamos 'T', HoraFin (en caso de que HoraFin sea null, entonces
> >>> usamos la
> >>> hora, los minutos y los segundos de la funcion getdate()) mas los
> >>> segundos de
> >>> la funcion getdate().
> >>>
> >>> Un trabalenguas verdad?, eso es lo que pasa cuando no usamos el
> >>> tipo


de
> >>> datos correcto para almacenar data en nuestra bd.
> >>>
> >>>
> >>> AMB
> >>>
> >>> "blackpower" wrote:
> >>>
> >>>> Buenos dias,
> >>>>
> >>>> Tengo una consulta que me devuelve:
> >>>>
> >>>> Tienda HoraInicio HoraFin
> >>>> Prica 10:20 14:10
> >>>> Caprabo 11:20
> >>>> Esquina 11:10 18:29
> >>>> Fitó as 13:45
> >>>>
> >>>> El problema es que quien diseñó la BD creó esos campos de hora en


un
> >>>> varchar!
> >>>>
> >>>> Ahora tengo que hacer una consulta que me devuelva las tiendas que


en
> >>>> el
> >>>> momento de hacer las consultas esté abierta... He pensado en:
> >>>>
> >>>> SELECT
> >>>> horaInicio,
> >>>> nombreTienda
> >>>>
> >>>> FROM tiendas
> >>>> WHERE isdate(horaInicio)=1
> >>>> AND cast(horaInicio as datetime)>=getdate()
> >>>>
> >>>> Esta consulta "peta" por el cast: Error de sintaxis al convertir


una
> >>>> cadena
> >>>> de caracteres a datetime.
> >>>>
> >>>>
> >>>> Existe alguna forma de sacar esta consulta?
> >>>>
> >>>>
> >>>> Gracias de antemano y saludos,
> >>>>
> >>>> Xus.
> >>>>
> >>>>
> >>>>
> >>>>
> >>
> >>
> >
> >
>
>
>




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