segundo martes de un mes

10/03/2008 - 18:48 por Jaime Lucci | Informe spam
Hola a todos!!

Alguien sabe como puedo sacar que día es el segundo martes de un mes??

Por ejemplo, el segundo martes de Marzo08 es 11.

Saludos!

Jaime Lucci
jaimelucci@hotmail.com

Preguntas similare

Leer las respuestas

#6 Carlos M. Calvelo
11/03/2008 - 13:36 | Informe spam
On 10 mrt, 22:04, "Jaime Lucci" wrote:
Hola Gustavo. Gracias por el Link

Te paso la modificacion para SQL que hice, lo puse en una función. se pasa un orden y un dia determinado, por ejemplo, quiero saber que fecha es el primer lunes del mes actual: (@norden va 1, 2, 3, 4 ó 5) (@ndia va 0: domingo a 6: sábado)

Para lo que lo necesitaba es para un calendario festivo, para saber si el dia actual (getdate()) corresponde al @norden @ndia del mes actual.

PD: Gracias a Alejandro también, pero en este caso no necesito preocuparme por el valor de @@DATEFIRST.

ALTER FUNCTION dbo.OrdenDia(@norden INT, @ndia INT) RETURNS DATETIME
AS
BEGIN

    DECLARE @ndiacalculado INT,
            @nsumarsemana  INT

    SET @nsumarsemana = 7*1 - 6 + (@ndia - ((1 + (year(getdate()) - (14 - month(getdate())) / 12) + (year(getdate()) - (14 - month(getdate())) / 12)/4 - (year(getdate()) - (14 - month(getdate())) / 12)/100 + (year(getdate()) - (14 - month(getdate())) / 12)/400 + (31*(month(getdate()) + 12*((14 - month(getdate())) / 12) - 2))/12) % 7))%7

    IF @nsumarsemana < 0
        SET @nsumarsemana = 7
    ELSE        
        SET @nsumarsemana = 0

    SET @ndiacalculado = 7*@norden - 6 + (@ndia - ((1 + (year(getdate()) - (14 - month(getdate())) / 12) + (year(getdate()) - (14 - month(getdate())) / 12)/4 - (year(getdate()) - (14 - month(getdate())) / 12)/100 + (year(getdate()) - (14 - month(getdate())) / 12)/400 + (31*(month(getdate()) + 12*((14 - month(getdate())) / 12) - 2))/12) % 7))%7 + @nsumarsemana

    IF @ndiacalculado < 0
        SET @ndiacalculado = @ndiacalculado + 7

    RETURN CAST(LTRIM(RTRIM(STR(YEAR(GETDATE())))) + '-' + RIGHT('0' + LTRIM(RTRIM(STR(MONTH(GETDATE())))),2) + '-' + RIGHT('0' + LTRIM(RTRIM(STR(@ndiacalculado))),2) AS DATETIME)

END





Hola Jaime,

Vaya cosa mas complicada te has montado.
Y asi?

create function OrdenDia(@mes char(6), @nOrden int, @nDia int)
returns datetime
as
begin
declare @ds1 int
set @ds1 =(DATEPART(DW, @mes+'01') + @@DATEFIRST) % 7
return cast(@mes+'01' as datetime)
+ case when @ds1>@nDia then @nOrden else @nOrden-1 end * 7
- @ds1 + @nDia
end

@ndia es 0..6 (0=sabado, 1=domingo, 2=lunes, ..., 6=viernes)

Por ejemplo el tercer miercoles de abril de 2008:

print dbo.OrdenDia('200804', 3, 4)

Resultado: 16/4/2008

Saludos,
Carlos
Respuesta Responder a este mensaje
#7 Jaime Lucci
13/03/2008 - 16:57 | Informe spam
Espectacular Carlos! Gracias!!!

Funciona como el mío pero no se puede comparar la complejidad del mio con la
simpleza del tuyo... lo voy a utilizar.

Saludos.

"Carlos M. Calvelo" escribió en el mensaje
news:
On 10 mrt, 22:04, "Jaime Lucci" wrote:
Hola Gustavo. Gracias por el Link

Te paso la modificacion para SQL que hice, lo puse en una función. se pasa


un orden y un dia determinado, por ejemplo, quiero saber que fecha es el
primer lunes del mes actual: (@norden va 1, 2, 3, 4 ó 5) (@ndia va 0:
domingo a 6: sábado)

Para lo que lo necesitaba es para un calendario festivo, para saber si el


dia actual (getdate()) corresponde al @norden @ndia del mes actual.

PD: Gracias a Alejandro también, pero en este caso no necesito preocuparme


por el valor de @@DATEFIRST.

ALTER FUNCTION dbo.OrdenDia(@norden INT, @ndia INT) RETURNS DATETIME
AS
BEGIN

DECLARE @ndiacalculado INT,
@nsumarsemana INT

SET @nsumarsemana = 7*1 - 6 + (@ndia - ((1 + (year(getdate()) - (14 -


month(getdate())) / 12) + (year(getdate()) - (14 - month(getdate())) /
12)/4 - (year(getdate()) - (14 - month(getdate())) / 12)/100 +
(year(getdate()) - (14 - month(getdate())) / 12)/400 + (31*(month(getdate())
+ 12*((14 - month(getdate())) / 12) - 2))/12) % 7))%7

IF @nsumarsemana < 0
SET @nsumarsemana = 7
ELSE
SET @nsumarsemana = 0

SET @ndiacalculado = 7*@norden - 6 + (@ndia - ((1 + (year(getdate()) -


(14 - month(getdate())) / 12) + (year(getdate()) - (14 - month(getdate())) /
12)/4 - (year(getdate()) - (14 - month(getdate())) / 12)/100 +
(year(getdate()) - (14 - month(getdate())) / 12)/400 + (31*(month(getdate())
+ 12*((14 - month(getdate())) / 12) - 2))/12) % 7))%7 + @nsumarsemana

IF @ndiacalculado < 0
SET @ndiacalculado = @ndiacalculado + 7

RETURN CAST(LTRIM(RTRIM(STR(YEAR(GETDATE())))) + '-' + RIGHT('0' +


LTRIM(RTRIM(STR(MONTH(GETDATE())))),2) + '-' + RIGHT('0' +
LTRIM(RTRIM(STR(@ndiacalculado))),2) AS DATETIME)

END





Hola Jaime,

Vaya cosa mas complicada te has montado.
Y asi?

create function OrdenDia(@mes char(6), @nOrden int, @nDia int)
returns datetime
as
begin
declare @ds1 int
set @ds1 =(DATEPART(DW, @mes+'01') + @@DATEFIRST) % 7
return cast(@mes+'01' as datetime)
+ case when @ds1>@nDia then @nOrden else @nOrden-1 end * 7
- @ds1 + @nDia
end

@ndia es 0..6 (0=sabado, 1=domingo, 2=lunes, ..., 6=viernes)

Por ejemplo el tercer miercoles de abril de 2008:

print dbo.OrdenDia('200804', 3, 4)

Resultado: 16/4/2008

Saludos,
Carlos
Respuesta Responder a este mensaje
#8 Luis Tarzia
21/03/2008 - 23:03 | Informe spam
declare function diamartes (@mes int,@año int)

declare @fechadesde datetime

set @fechadesde ='01/' + case when @mes < 10 then '0' else '' end
+convert(varchar(2),@mes)+'/'+convert( varchar(4),@año)
while @fechadesde <= dateadd(mm,1,@fechadesde)
if datepart(dw,@fechadesde)=3
begin
return dateadd(dd,7,@fechadesde)
end
set @fechadesde = dateadd(dd,1,@fechadesde)
end

Mas simple imposible y si todos esas cuentas de año,mes,dias



"Jaime Lucci" escribió en el mensaje
news:#
Hola a todos!!

Alguien sabe como puedo sacar que día es el segundo martes de un mes??

Por ejemplo, el segundo martes de Marzo08 es 11.

Saludos!

Jaime Lucci



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