SQL Server - Funcion SQL

 
Vista:

Funcion SQL

Publicado por kperez (18 intervenciones) el 21/10/2019 20:12:10
Buenos días,
tengo el siguiente caso, cree una función donde me tiene que mandar el ultimo día del mes agregando un fecha X, y me mande Null cuando sea una fecha invalida. Pero el detalle que tengo es que no me esta validando que sea de tipo fecha ya que agrego una fecha valida y me manda Null(osea no es una fecha valida)lo cual no es correcto, me pueden ayudar e indicarme que me falta para convertirlo a tipo fecha. adjunto mi función y un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE FUNCTION dbo.Fecha
(
@Fechs as datetime
)
RETURNS varchar(10)
AS
BEGIN
    declare @Fech as datetime
 
   SET @Fech=
    CASE WHEN ISDATE(@Fech) = 0 THEN NULL
    ELSE
         CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@Fech))),DATEADD(mm,1,@Fech)),104)
    END
	RETURN @Fech
	END;
 
	go
	select dbo.Fecha('1990.02.2') --ejemplo no me devuelve el tipo de fecha y es una fecha correcta
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
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Funcion SQL

Publicado por Isaias (4558 intervenciones) el 22/10/2019 16:29:17
En el RETURN, coloca

RETURN cast(@Fech as datetime)
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

Funcion SQL

Publicado por Kperezf (18 intervenciones) el 22/10/2019 19:08:40
Buen día Isaias gracias por tu repuesta, fíjate que realice lo que indicas, pero aun me aparece Null.
Es una fecha valida.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE FUNCTION dbo.Fecha
(
@Fechs as date
)
RETURNS varchar(8)
AS
BEGIN
    declare @Fech as datetime
 
   SET @Fechs=
    CASE WHEN ISDATE(@fech) = 0 THEN NULL
    ELSE
         CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@fech))),DATEADD(mm,1,@fech)),104)
    END
	RETURN cast(@Fech as datetime)
	END;
 
	go
	select dbo.Fecha('1900.02.2')
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
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Funcion SQL

Publicado por Isaias (4558 intervenciones) el 22/10/2019 19:36:42
Veamos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ALTER FUNCTION dbo.Fecha
(
@Fechs as date
)
RETURNS DATETIME
AS
BEGIN
DECLARE @FechOut DATETIME
SET @FechOut =
CASE WHEN ISDATE(CAST(@Fechs AS VARCHAR(30))) = 0 THEN '1900.02.2'
ELSE DATEADD(dd,-(DAY(DATEADD(mm,1,@Fechs))),DATEADD(mm,1,@Fechs))
--CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@fech))),DATEADD(mm,1,@fech)),104)
END
RETURN (@FechOut)
END;
GO
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

Funcion SQL

Publicado por kperezf (18 intervenciones) el 22/10/2019 20:18:48
Esta excelente.
Pero lo que requiero es al momento de ejecutar la función me mande el ultimo día del mes de una Fecha"X", por esa razón en vez de la fecha tiene que ser( Then Null) para que en caso que ingrese una fecha fuera del rango me mande "NULL" en este caso no puedo, otro detalle esq no requiero me aparezca la hora,minutos y segundos.
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
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Funcion SQL

Publicado por Isaias (4558 intervenciones) el 22/10/2019 22:18:59
Si lo unico que necesitas es el ULTIMO DIA de la fecha en cuestion

1
SELECT EOMONTH ('1900.02.2')
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

Funcion SQL

Publicado por kperezf (18 intervenciones) el 22/10/2019 22:33:40
Estimado, la función EOMONTH no me funciona ya que me indica que no es una función integrada conocido.
Lo que necesito es que mi función(La que pase de primero) me regrese el ultimo día del mes cuando se dijite la fecha en el SELECT al momento de llamar la función y me regrese Null cuando se dijite una fecha no valida en el Select. Pero no se que es lo que me hace falta.
Nota: La fecha dada en mi Función es solamente un ejemplo, ya que puede ser cualquier fecha digitada en ese parámetro.
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
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Funcion SQL

Publicado por Isaias (4558 intervenciones) el 22/10/2019 22:38:22
¿Que version tienes de SQL Server?

En caso de que fuera 2008

1
SELECT CONVERT(VARCHAR, DATEADD(d, -1, DATEADD(m, 1, DATEADD(d,1 - DAY(getdate()), getdate()))),105)
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

Funcion SQL

Publicado por kperez (18 intervenciones) el 22/10/2019 22:45:20
SQL Server M.S 2017 (V17.5)
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
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Funcion SQL

Publicado por Isaias (4558 intervenciones) el 22/10/2019 22:54:17
Ejecuta en un query

SELECT @@VERSION y publica aqui el resultado

Aqui hay otras dos variantes de SQL Server 2008 R2

1
2
3
SELECT CONVERT(VARCHAR,DATEADD(SECOND,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE())+1,0)),105)
 
SELECT CONVERT(VARCHAR,DATEADD(d, -1, DATEADD(m, 1, DATEADD(d, 1 - DAY(GETDATE()), GETDATE()))),105)
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

Funcion SQL

Publicado por kperez (18 intervenciones) el 22/10/2019 23:48:03
me mando el siguiente resultado:
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) .
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

Funcion SQL

Publicado por kperezf (18 intervenciones) el 23/10/2019 00:20:52
aaaaaaa.
Pero entonces como debería de quedar estructurada mi función para poder visualizar lo que requiero al momento de hacer el select con una fecha X...?
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
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Funcion SQL

Publicado por Isaias (4558 intervenciones) el 23/10/2019 01:09:29
Hola

No he encontrado como quitarle las horas y minutos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ALTER FUNCTION dbo.Fecha
(
@Fechs as date
)
RETURNS DATETIME
AS
BEGIN
DECLARE @FechOut date
 
IF ISDATE(CAST(@Fechs AS VARCHAR)) = 0
 BEGIN
  SET @FechOut = null
 END
ELSE
 SET @FechOut  = DATEADD(d, -1, DATEADD(m, 1, DATEADD(d, 1 - DAY(@Fechs), @Fechs)))
RETURN  @FechOut
END
GO

DECLARE @Myfecha datetime
select @Myfecha = dbo.Fecha('20190101')
select convert(varchar,@Myfecha, 105)
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
Imágen de perfil de Plutarco Pérez
Val: 122
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Funcion SQL

Publicado por Plutarco Pérez (46 intervenciones) el 25/10/2019 00:10:51
Buenas tardes, perdón que me meta en su solución

El código está bien, solo que estás regresando un DATETIME (RETURNS DATETIME), regresa solo DATE y te liberas de la hora, por otro lado para calcular el último día del mes usa SELECT DATEADD(DAY, -DAY(@Fecha), @Fecha)

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
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Funcion SQL

Publicado por Isaias (4558 intervenciones) el 25/10/2019 17:09:36
Hola Plutarco, gracias por apoyar

Pues nada, que modifique la funcion para regresar un DATE y sigue enviandome la fecha con horas y minutos

Tambien probe tu codigo y me regresa un MES erroneo, en este caso, SEPTIEMBRE y debe regresar OCTUBRE

Anexo los testigos


Captura
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
Imágen de perfil de plutarco.perex.flores@hotmail.com
Val: 122
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Funcion SQL

Publicado por [email protected] (46 intervenciones) el 28/10/2019 15:03:44
Tienes muchísima razón, mi error

Efectivamente, estoy calculando el último día del mes anterior con SELECT DATEADD(DAY, -DAY(GETDATE()), GETDATE()). Mi error.
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