Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] Mejorar la funcón del primer día del mes

Estas en el tema de Mejorar la funcón del primer día del mes en el foro de SQL Server en Foros del Web. Buenas Se que se ha hablado otras veces del tema, ya he hecho la búsqueda y de hecho tengo implementada la función para calcular el ...
  #1 (permalink)  
Antiguo 14/01/2015, 03:44
 
Fecha de Ingreso: diciembre-2014
Mensajes: 111
Antigüedad: 9 años, 4 meses
Puntos: 9
Mejorar la funcón del primer día del mes

Buenas

Se que se ha hablado otras veces del tema, ya he hecho la búsqueda y de hecho tengo implementada la función para calcular el primer día de mes (el día 1)

Código SQL:
Ver original
  1. DATEADD(DAY,1-DAY(FchDada),FchDada)

Pero sinceramente el código me parece horriblemente feo y en mi caso concreto lioso, ya que lo utilizo dentro de funciones que llaman a otras funciones y al final entre tanto paréntesis el código al releerlo es casi indescifrable.

¿No hay ninguna forma más limpia de hacerlo? Algo tipo el fantástico EOMONTH() para hallar el último día sería perfecto pero en la documentación no hay nada...

Un saludo

Última edición por gnzsoloyo; 14/01/2015 a las 05:58
  #2 (permalink)  
Antiguo 14/01/2015, 05:52
 
Fecha de Ingreso: octubre-2014
Ubicación: Buenos Aires
Mensajes: 278
Antigüedad: 9 años, 6 meses
Puntos: 12
Respuesta: Mejorar la funcón del primer día del mes

Hola Sarlit, yo utilizo algo así.

Código SQL:
Ver original
  1. SELECT CONVERT(CHAR(6), getdate(), 112) + '01' AS [primer dia]

Espero te sirva.

Saludos.
__________________
http://www.sp-vision.net
  #3 (permalink)  
Antiguo 14/01/2015, 06:03
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Mejorar la funcón del primer día del mes

Cita:
Iniciado por Sarlit Ver Mensaje
Buenas

Se que se ha hablado otras veces del tema, ya he hecho la búsqueda y de hecho tengo implementada la función para calcular el primer día de mes (el día 1)

Código SQL:
Ver original
  1. DATEADD(DAY,1-DAY(FchDada),FchDada)

Pero sinceramente el código me parece horriblemente feo y en mi caso concreto lioso, ya que lo utilizo dentro de funciones que llaman a otras funciones y al final entre tanto paréntesis el código al releerlo es casi indescifrable.

¿No hay ninguna forma más limpia de hacerlo? Algo tipo el fantástico EOMONTH() para hallar el último día sería perfecto pero en la documentación no hay nada...

Un saludo
Me resulta algo intrigante tu problema, ya que lo que describes es una "funcion para calcular el primer día de mes"...

¿Una función para calcualr el día 1 del mes?



¿O estás planteando crear un DATE del mes en curso, con el día 1?
Porque la verdad es que calcular el primer día de un mes... en realidad no le encuentro mucho sentido. El último día del mes, es necesario, porque habiendo cuatro posibilidades, y dependiendo esta del mes y año de que se trate (recordar los 29 de febrero en bisiestos), para hacer algo dinámico se entiende. Pero ¿el primero?



¿Cual es exactamente la meta?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 14/01/2015, 09:12
 
Fecha de Ingreso: diciembre-2014
Mensajes: 111
Antigüedad: 9 años, 4 meses
Puntos: 9
Respuesta: Mejorar la funcón del primer día del mes

Es un problema heredado, a mi me dan un mes con un día al azar y yo tengo que hacer varios cálculos sobre ese mes en función de datos que se encuentran en otras tablas pero que están en ese mismo mes. Para ello lo que hago es un select sobre las otras tablas que me devuelva todos los sucesos entre el último y el primer día del mes que me dan, estos inclusive.

Antes lo hacia con MONTH() pero me daba problemas por los años y si lo hacia teniendo en cuenta meses y años la consulta tardaba demasiado...

Esta forma que uso ahora funciona más rápida y me da menos problemas, pero a la vez me parece "algo sucia" por eso buscaba algo más "limpio"

Un saludo.
  #5 (permalink)  
Antiguo 14/01/2015, 09:24
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Mejorar la funcón del primer día del mes

pues si te dan el mes y el año nada mas arma tu consulta con:

convert(datetime,@mes + '/' + '01' + @año)

no entiendo porque el dateadd, si como te dijo gnzsoloyo, el primer dia del mes siempre va a ser 01 :P
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 14/01/2015, 09:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Mejorar la funcón del primer día del mes

¿Y no te sirve ago como DATEFROMPARTS()?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 14/01/2015, 09:50
 
Fecha de Ingreso: diciembre-2014
Mensajes: 111
Antigüedad: 9 años, 4 meses
Puntos: 9
Respuesta: Mejorar la funcón del primer día del mes

Cita:
Iniciado por Libras Ver Mensaje
pues si te dan el mes y el año nada mas arma tu consulta con:

convert(datetime,@mes + '/' + '01' + @año)

no entiendo porque el dateadd, si como te dijo gnzsoloyo, el primer dia del mes siempre va a ser 01 :P
La idea es que a la fecha que me den le resto los días que me dan y el sumo 1, así siempre me sale el 1 de cada mes.

He intentado el convert pero no consigo que me salga lo que quiero.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Y no te sirve ago como DATEFROMPARTS()?
Esto es justo lo que buscaba, bueno, justo lo que buscaba sería indicarle solo la fecha y el día, por eso no caí en esta opción, ¡muchas gracias!

Al final el código queda tal que así:

Código:
DATEFROMPARTS ( YEAR(GETDATE()), MONTH(GETDATE()), 1 )
  #8 (permalink)  
Antiguo 14/01/2015, 10:01
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Mejorar la funcón del primer día del mes

Cita:
Iniciado por Sarlit Ver Mensaje
La idea es que a la fecha que me den le resto los días que me dan y el sumo 1, así siempre me sale el 1 de cada mes.

He intentado el convert pero no consigo que me salga lo que quiero.



Esto es justo lo que buscaba, bueno, justo lo que buscaba sería indicarle solo la fecha y el día, por eso no caí en esta opción, ¡muchas gracias!

Al final el código queda tal que así:

Código:
DATEFROMPARTS ( YEAR(GETDATE()), MONTH(GETDATE()), 1 )
Lo que te propongo es lo mismo que lo que te propuso gnzsoloyo solo que sin una funcion, porque restas los dias para que te de el primer dia del mes, si el primer dia del mes siempre y digo siempre va a ser 1 :P
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 14/01/2015, 10:09
 
Fecha de Ingreso: diciembre-2014
Mensajes: 111
Antigüedad: 9 años, 4 meses
Puntos: 9
Respuesta: Mejorar la funcón del primer día del mes

Cita:
Iniciado por Libras Ver Mensaje
Lo que te propongo es lo mismo que lo que te propuso gnzsoloyo solo que sin una funcion, porque restas los dias para que te de el primer dia del mes, si el primer dia del mes siempre y digo siempre va a ser 1 :P
Si el concepto lo entiendo pero no se como montar la consulta... He intentado:

Código:
convert(datetime,MONTH(GETDATE()) + '/' + '01' + YEAR(GETDATE())) 
convert(datetime,MONTH(GETDATE()) + '/' + '01' +'/'+ YEAR(GETDATE())) 
convert(datetime,MONTH(GETDATE()) + '01' + YEAR(GETDATE())) 
convert(datetime,YEAR(GETDATE())+MONTH(GETDATE())+'01') 
convert(datetime,YEAR(GETDATE())+'/'+MONTH(GETDATE())+'/'+'01')
Y o me daban error o me salia 11-7-1905...¿Cómo sería?
  #10 (permalink)  
Antiguo 14/01/2015, 11:05
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Mejorar la funcón del primer día del mes

como te mandan los parametros?

seria algo asi:

Código SQL:
Ver original
  1. SELECT CONVERT(datetime,CONVERT(VARCHAR(20),datepart(mm,getdate())) + '/' + '01' + '/' + CONVERT(VARCHAR(20),datepart(yyyy,getdate())))

y te da una fecha en formato mm/dd/yyyy
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 15/01/2015, 02:45
 
Fecha de Ingreso: diciembre-2014
Mensajes: 111
Antigüedad: 9 años, 4 meses
Puntos: 9
Respuesta: Mejorar la funcón del primer día del mes

Cita:
Iniciado por Libras Ver Mensaje
como te mandan los parametros?

seria algo asi:

Código SQL:
Ver original
  1. SELECT CONVERT(datetime,CONVERT(VARCHAR(20),datepart(mm,getdate())) + '/' + '01' + '/' + CONVERT(VARCHAR(20),datepart(yyyy,getdate())))

y te da una fecha en formato mm/dd/yyyy
Ahhh, vale, esa funciona bien pero como dije al principio la idea era hacerlo de la forma más directa posible para que el código no resultara confusa en futuras revisiones.

Decididamente DATEFROMPARTS() como ha indicado gnzsoloyo me parece la forma más entendible y sencilla de hacerlo.

¡Muchas gracias a todos por la ayuda!

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:46.