FUNCION TSQL

04/08/2005 - 20:12 por Mauro | Informe spam
TENGO 2 FECHAS a y b y necesito una funcion que me devuelva los distintos
particiones añomes que existe entre las 2, ej

a/01/2005
b/06/2005

20051,20052,20053,20054,20055,20056

se que esto es algo bastante usado asi que quizas alguien tenga ya la
solucion.
gracias

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
04/08/2005 - 21:45 | Informe spam
Mauro,

Te es suficiente con que la funcion devuelva una tabla con estos valores?.
Si es asi entonces puedes usar una tabla auxiliar de numeros, siempre es muy
util tener una en la bd.

select
identity(int, 1, 1) as number
into
dbo.number
from
sysobjects as a
cross join
sysobjects as b
go

create unique clustered index ix_u_c_number_number on number(number asc)
go

create function dbo.f1 (
@sd datetime,
@ed datetime
)
returns table
as
return (
select
ltrim(year(dateadd(month, n.number - 1, @sd))) + ltrim(month(dateadd(month,
n.number - 1, @sd))) as c1
from
number as n
where
number between 1 and (datediff(month, @sd, @ed) + 1)
)
go

select
*
from
dbo.f1('20050101', '20050601')
go

drop function dbo.f1
go

drop table number
go


AMB


"Mauro" wrote:

TENGO 2 FECHAS a y b y necesito una funcion que me devuelva los distintos
particiones añomes que existe entre las 2, ej

a/01/2005
b/06/2005

20051,20052,20053,20054,20055,20056

se que esto es algo bastante usado asi que quizas alguien tenga ya la
solucion.
gracias



Respuesta Responder a este mensaje
#2 Mauro
04/08/2005 - 21:59 | Informe spam
mm esta buena, pero que te parece esta que me hice, le faltan las variables
de entrada y salida pero la estructura es esta:

declare @from smalldatetime
declare @to smalldatetime

declare @result nvarchar(1000)
set @result=''

set @from = '2005-01-01'
set @to = '2005-03-01'

WHILE @from <> DATEADD(mm ,1, @to )
begin
set @result = @result + ltrim(str(year(@from)))+ ltrim(str(month(@from)))
if @from <> @to
set @result = @result + ','
set @FROM = DATEADD(mm ,1, @From )
end

print @result


"Alejandro Mesa" wrote in message
news:
Mauro,

Te es suficiente con que la funcion devuelva una tabla con estos valores?.
Si es asi entonces puedes usar una tabla auxiliar de numeros, siempre es


muy
util tener una en la bd.

select
identity(int, 1, 1) as number
into
dbo.number
from
sysobjects as a
cross join
sysobjects as b
go

create unique clustered index ix_u_c_number_number on number(number asc)
go

create function dbo.f1 (
@sd datetime,
@ed datetime
)
returns table
as
return (
select
ltrim(year(dateadd(month, n.number - 1, @sd))) +


ltrim(month(dateadd(month,
n.number - 1, @sd))) as c1
from
number as n
where
number between 1 and (datediff(month, @sd, @ed) + 1)
)
go

select
*
from
dbo.f1('20050101', '20050601')
go

drop function dbo.f1
go

drop table number
go


AMB


"Mauro" wrote:

> TENGO 2 FECHAS a y b y necesito una funcion que me devuelva los


distintos
> particiones añomes que existe entre las 2, ej
>
> a/01/2005
> b/06/2005
>
> 20051,20052,20053,20054,20055,20056
>
> se que esto es algo bastante usado asi que quizas alguien tenga ya la
> solucion.
> gracias
>
>
>
Respuesta Responder a este mensaje
#3 Alejandro Mesa
04/08/2005 - 22:35 | Informe spam
Mauro,

Si la funcion te es util no veo por que no. Mi pregunta es para que vas a
usar la cadena devuelta por la funcion?


AMB

"Mauro" wrote:

mm esta buena, pero que te parece esta que me hice, le faltan las variables
de entrada y salida pero la estructura es esta:

declare @from smalldatetime
declare @to smalldatetime

declare @result nvarchar(1000)
set @result=''

set @from = '2005-01-01'
set @to = '2005-03-01'

WHILE @from <> DATEADD(mm ,1, @to )
begin
set @result = @result + ltrim(str(year(@from)))+ ltrim(str(month(@from)))
if @from <> @to
set @result = @result + ','
set @FROM = DATEADD(mm ,1, @From )
end

print @result


"Alejandro Mesa" wrote in message
news:
> Mauro,
>
> Te es suficiente con que la funcion devuelva una tabla con estos valores?.
> Si es asi entonces puedes usar una tabla auxiliar de numeros, siempre es
muy
> util tener una en la bd.
>
> select
> identity(int, 1, 1) as number
> into
> dbo.number
> from
> sysobjects as a
> cross join
> sysobjects as b
> go
>
> create unique clustered index ix_u_c_number_number on number(number asc)
> go
>
> create function dbo.f1 (
> @sd datetime,
> @ed datetime
> )
> returns table
> as
> return (
> select
> ltrim(year(dateadd(month, n.number - 1, @sd))) +
ltrim(month(dateadd(month,
> n.number - 1, @sd))) as c1
> from
> number as n
> where
> number between 1 and (datediff(month, @sd, @ed) + 1)
> )
> go
>
> select
> *
> from
> dbo.f1('20050101', '20050601')
> go
>
> drop function dbo.f1
> go
>
> drop table number
> go
>
>
> AMB
>
>
> "Mauro" wrote:
>
> > TENGO 2 FECHAS a y b y necesito una funcion que me devuelva los
distintos
> > particiones añomes que existe entre las 2, ej
> >
> > a/01/2005
> > b/06/2005
> >
> > 20051,20052,20053,20054,20055,20056
> >
> > se que esto es algo bastante usado asi que quizas alguien tenga ya la
> > solucion.
> > gracias
> >
> >
> >



Respuesta Responder a este mensaje
#4 Mauro
04/08/2005 - 23:30 | Informe spam
para meterla en un IN, de todas formas hice una version que devuelve una
tabla

"Alejandro Mesa" wrote in message
news:
Mauro,

Si la funcion te es util no veo por que no. Mi pregunta es para que vas a
usar la cadena devuelta por la funcion?


AMB

"Mauro" wrote:

> mm esta buena, pero que te parece esta que me hice, le faltan las


variables
> de entrada y salida pero la estructura es esta:
>
> declare @from smalldatetime
> declare @to smalldatetime
>
> declare @result nvarchar(1000)
> set @result=''
>
> set @from = '2005-01-01'
> set @to = '2005-03-01'
>
> WHILE @from <> DATEADD(mm ,1, @to )
> begin
> set @result = @result + ltrim(str(year(@from)))+


ltrim(str(month(@from)))
> if @from <> @to
> set @result = @result + ','
> set @FROM = DATEADD(mm ,1, @From )
> end
>
> print @result
>
>
> "Alejandro Mesa" wrote in


message
> news:
> > Mauro,
> >
> > Te es suficiente con que la funcion devuelva una tabla con estos


valores?.
> > Si es asi entonces puedes usar una tabla auxiliar de numeros, siempre


es
> muy
> > util tener una en la bd.
> >
> > select
> > identity(int, 1, 1) as number
> > into
> > dbo.number
> > from
> > sysobjects as a
> > cross join
> > sysobjects as b
> > go
> >
> > create unique clustered index ix_u_c_number_number on number(number


asc)
> > go
> >
> > create function dbo.f1 (
> > @sd datetime,
> > @ed datetime
> > )
> > returns table
> > as
> > return (
> > select
> > ltrim(year(dateadd(month, n.number - 1, @sd))) +
> ltrim(month(dateadd(month,
> > n.number - 1, @sd))) as c1
> > from
> > number as n
> > where
> > number between 1 and (datediff(month, @sd, @ed) + 1)
> > )
> > go
> >
> > select
> > *
> > from
> > dbo.f1('20050101', '20050601')
> > go
> >
> > drop function dbo.f1
> > go
> >
> > drop table number
> > go
> >
> >
> > AMB
> >
> >
> > "Mauro" wrote:
> >
> > > TENGO 2 FECHAS a y b y necesito una funcion que me devuelva los
> distintos
> > > particiones añomes que existe entre las 2, ej
> > >
> > > a/01/2005
> > > b/06/2005
> > >
> > > 20051,20052,20053,20054,20055,20056
> > >
> > > se que esto es algo bastante usado asi que quizas alguien tenga ya


la
> > > solucion.
> > > gracias
> > >
> > >
> > >
>
>
>
Respuesta Responder a este mensaje
#5 Alejandro Mesa
05/08/2005 - 14:31 | Informe spam
Mauro,

para meterla en un IN, de todas formas hice una version que devuelve una
tabla



Creo que hicistes bien, pues ahora puedes hacer algo asi como:

select * from t1 as a inner join dbo.f1('20050101', '20050601') as b
on a.c1 = b.c1

sin necesidad de crear sql dinamico.


AMB

"Mauro" wrote:

para meterla en un IN, de todas formas hice una version que devuelve una
tabla

"Alejandro Mesa" wrote in message
news:
> Mauro,
>
> Si la funcion te es util no veo por que no. Mi pregunta es para que vas a
> usar la cadena devuelta por la funcion?
>
>
> AMB
>
> "Mauro" wrote:
>
> > mm esta buena, pero que te parece esta que me hice, le faltan las
variables
> > de entrada y salida pero la estructura es esta:
> >
> > declare @from smalldatetime
> > declare @to smalldatetime
> >
> > declare @result nvarchar(1000)
> > set @result=''
> >
> > set @from = '2005-01-01'
> > set @to = '2005-03-01'
> >
> > WHILE @from <> DATEADD(mm ,1, @to )
> > begin
> > set @result = @result + ltrim(str(year(@from)))+
ltrim(str(month(@from)))
> > if @from <> @to
> > set @result = @result + ','
> > set @FROM = DATEADD(mm ,1, @From )
> > end
> >
> > print @result
> >
> >
> > "Alejandro Mesa" wrote in
message
> > news:
> > > Mauro,
> > >
> > > Te es suficiente con que la funcion devuelva una tabla con estos
valores?.
> > > Si es asi entonces puedes usar una tabla auxiliar de numeros, siempre
es
> > muy
> > > util tener una en la bd.
> > >
> > > select
> > > identity(int, 1, 1) as number
> > > into
> > > dbo.number
> > > from
> > > sysobjects as a
> > > cross join
> > > sysobjects as b
> > > go
> > >
> > > create unique clustered index ix_u_c_number_number on number(number
asc)
> > > go
> > >
> > > create function dbo.f1 (
> > > @sd datetime,
> > > @ed datetime
> > > )
> > > returns table
> > > as
> > > return (
> > > select
> > > ltrim(year(dateadd(month, n.number - 1, @sd))) +
> > ltrim(month(dateadd(month,
> > > n.number - 1, @sd))) as c1
> > > from
> > > number as n
> > > where
> > > number between 1 and (datediff(month, @sd, @ed) + 1)
> > > )
> > > go
> > >
> > > select
> > > *
> > > from
> > > dbo.f1('20050101', '20050601')
> > > go
> > >
> > > drop function dbo.f1
> > > go
> > >
> > > drop table number
> > > go
> > >
> > >
> > > AMB
> > >
> > >
> > > "Mauro" wrote:
> > >
> > > > TENGO 2 FECHAS a y b y necesito una funcion que me devuelva los
> > distintos
> > > > particiones añomes que existe entre las 2, ej
> > > >
> > > > a/01/2005
> > > > b/06/2005
> > > >
> > > > 20051,20052,20053,20054,20055,20056
> > > >
> > > > se que esto es algo bastante usado asi que quizas alguien tenga ya
la
> > > > solucion.
> > > > gracias
> > > >
> > > >
> > > >
> >
> >
> >



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