una separar semana por obtener numero nombre mes hora fecha datepart como año sql sql-server datetime date user-defined-functions

separar - obtener hora sql server



¿Cómo determinar el número de días en un mes en SQL Server? (24)

Necesito determinar el número de días en un mes para una fecha dada en SQL Server.

¿Hay una función incorporada? Si no, ¿qué debería usar como la función definida por el usuario?


En SQL Server 2012 puede usar EOMONTH (Transact-SQL) para obtener el último día del mes y luego puede usar DAY (Transact-SQL) para obtener la cantidad de días del mes.

DECLARE @ADate DATETIME SET @ADate = GETDATE() SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth


Este código te da la cantidad de días en el mes actual:

SELECT datediff(dd,getdate(),dateadd(mm,1,getdate())) as datas

Cambia getdate() a la fecha para la que necesitas contar los días.


La respuesta de Mehrdad Afshari es la más acertada, aparte de lo usual, esta respuesta se basa en el enfoque matemático formal dado por Curtis McEnroe en su blog https://cmcenroe.me/2014/12/05/days-in-month-formula.html

DECLARE @date DATE= ''2015-02-01'' DECLARE @monthNumber TINYINT DECLARE @dayCount TINYINT SET @monthNumber = DATEPART(MONTH,@date ) SET @dayCount = 28 + (@monthNumber + floor(@monthNumber/8)) % 2 + 2 % @monthNumber + 2 * floor(1/@monthNumber) SELECT @dayCount + CASE WHEN @dayCount = 28 AND DATEPART(YEAR,@date)%4 =0 THEN 1 ELSE 0 END -- leap year adjustment


La solución más elegante: funciona para cualquier @DATE

DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,@DATE),0)))

Tíralo en una función o simplemente úsala en línea. Esto responde la pregunta original sin toda la basura adicional en las otras respuestas.

ejemplos para fechas de otras respuestas:

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,''1/31/2009''),0))) Devuelve 31

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,''2404-feb-15''),0))) Devuelve 29

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,''2011-12-22''),0))) Devuelve 31


Mucho más simple ... prueba el day(eomonth(@Date))


Necesita agregar una función, pero es simple. Yo uso esto:

CREATE FUNCTION [dbo].[ufn_GetDaysInMonth] ( @pDate DATETIME ) RETURNS INT AS BEGIN SET @pDate = CONVERT(VARCHAR(10), @pDate, 101) SET @pDate = @pDate - DAY(@pDate) + 1 RETURN DATEDIFF(DD, @pDate, DATEADD(MM, 1, @pDate)) END GO


Necesita crear una función, pero es para su propia conveniencia. Funciona perfecto y nunca encontré ningún cálculo defectuoso usando esta función.

CREATE FUNCTION [dbo].[get_days](@date datetime) RETURNS int AS BEGIN SET @date = DATEADD(MONTH, 1, @date) DECLARE @result int = (select DAY(DATEADD(DAY, -DAY(@date), @date))) RETURN @result END

Cómo funciona: al restar el número del día de la fecha, se obtiene el último día del mes anterior. Por lo tanto, debe agregar un mes a la fecha especificada, restar el número del día y obtener el componente del día del resultado.


Para cualquier fecha

select DateDiff(Day,@date,DateAdd(month,1,@date))


Para obtener el no. de días en un mes, podemos usar directamente Day () disponible en SQL.

Siga el enlace publicado al final de mi respuesta para SQL Server 2005/2008.

El siguiente ejemplo y el resultado son de SQL 2012

alter function dbo.[daysinm] ( @dates nvarchar(12) ) returns int as begin Declare @dates2 nvarchar(12) Declare @days int begin select @dates2 = (select DAY(EOMONTH(convert(datetime,@dates,103)))) set @days = convert(int,@dates2) end return @days end --select dbo.daysinm(''08/12/2016'')

Resultado en SQL Server SSMS

(no column name) 1 31

Proceso:

Cuando se utiliza EOMONTH, cualquiera que sea el formato de fecha que lo use, se convierte al formato de DateTime del servidor SQL. Entonces, el resultado de la fecha de EOMONTH () será 2016-12-31 teniendo 2016 como año, 12 como mes y 31 como días. Este resultado cuando pasa a Day () le da el recuento total de días en el mes.

Si queremos obtener el resultado instantáneo para verificar, podemos ejecutar directamente el siguiente código,

select DAY(EOMONTH(convert(datetime,''08/12/2016'',103)))

o

select DAY(EOMONTH(convert(datetime,getdate(),103)))

para referencia al trabajo en SQL Server 2005/2008/2012, siga el siguiente enlace externo ...

Buscar número de días en un mes en SQL


Puede usar lo siguiente con el primer día del mes especificado:

datediff(day, @date, dateadd(month, 1, @date))

Para que funcione en todas las fechas:

datediff(day, dateadd(day, 1-day(@date), @date), dateadd(month, 1, dateadd(day, 1-day(@date), @date)))


Sé que esta pregunta es antigua, pero pensé que compartiría lo que estoy usando.

DECLARE @date date = ''2011-12-22'' /* FindFirstDayOfMonth - Find the first date of any month */ -- Replace the day part with -01 DECLARE @firstDayOfMonth date = CAST( CAST(YEAR(@date) AS varchar(4)) + ''-'' + CAST(MONTH(@date) AS varchar(2)) + ''-01'' AS date) SELECT @firstDayOfMonth

y

DECLARE @date date = ''2011-12-22'' /* FindLastDayOfMonth - Find what is the last day of a month - Leap year is handled by DATEADD */ -- Get the first day of next month and remove a day from it using DATEADD DECLARE @lastDayOfMonth date = CAST( DATEADD(dd, -1, DATEADD(mm, 1, FindFirstDayOfMonth(@date))) AS date) SELECT @lastDayOfMonth

Esos podrían combinarse para crear una función única para recuperar el número de días en un mes si es necesario.


Subí a Mehrdad, pero esto también funciona. :)

CREATE function dbo.IsLeapYear ( @TestYear int ) RETURNS bit AS BEGIN declare @Result bit set @Result = cast( case when ((@TestYear % 4 = 0) and (@testYear % 100 != 0)) or (@TestYear % 400 = 0) then 1 else 0 end as bit ) return @Result END GO CREATE FUNCTION dbo.GetDaysInMonth ( @TestDT datetime ) RETURNS INT AS BEGIN DECLARE @Result int DECLARE @MonthNo int Set @MonthNo = datepart(m,@TestDT) Set @Result = case @MonthNo when 1 then 31 when 2 then case when dbo.IsLeapYear(datepart(yyyy,@TestDT)) = 0 then 28 else 29 end when 3 then 31 when 4 then 30 when 5 then 31 when 6 then 30 when 7 then 31 when 8 then 31 when 9 then 30 when 10 then 31 when 11 then 30 when 12 then 31 end RETURN @Result END GO

Probar

declare @testDT datetime; set @testDT = ''2404-feb-15''; select dbo.GetDaysInMonth(@testDT)


aqui hay otro más...

Select Day(DateAdd(day, -Day(DateAdd(month, 1, getdate())), DateAdd(month, 1, getdate())))


consulta simple en SQLServer2012:

día seleccionado ((''20-05-1951 22:00:00''))

Probé durante muchas fechas y siempre devuelve un resultado correcto


select first_day = dateadd (dd, -1 * datepart (dd, getdate ()) + 1, getdate ()), last_day = dateadd (dd, -1 * datepart (dd, dateadd (mm, 1, getdate ())) , dateadd (mm, 1, getdate ())), no_of_days = 1 + datediff (dd, dateadd (dd, -1 * datepart (dd, getdate ()) + 1, getdate ()), dateadd (dd, -1 * datepart (dd, dateadd (mm, 1, getdate ())), dateadd (mm, 1, getdate ())))

reemplace cualquier fecha con getdate para obtener el no de meses en esa fecha en particular


Solución 1: Encuentre el número de días en cualquier mes en que estemos actualmente

DECLARE @dt datetime SET @dt = getdate() SELECT @dt AS [DateTime], DAY(DATEADD(mm, DATEDIFF(mm, -1, @dt), -1)) AS [Days in Month]

Solución 2: Encuentre la cantidad de días en un combo de mes-año determinado

DECLARE @y int, @m int SET @y = 2012 SET @m = 2 SELECT @y AS [Year], @m AS [Month], DATEDIFF(DAY, DATEADD(DAY, 0, DATEADD(m, ((@y - 1900) * 12) + @m - 1, 0)), DATEADD(DAY, 0, DATEADD(m, ((@y - 1900) * 12) + @m, 0)) ) AS [Days in Month]


Yo sugeriría:

día seleccionado (EOMONTH (getdate ()))


--Last Day of Previous Month SELECT DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))) --Last Day of Current Month SELECT DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))) --Last Day of Next Month SELECT DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0)))

Personalmente, sin embargo, crearía un UDF si no hubiera una función incorporada ...


DECLARE @Month INT=2, @Year INT=1989 DECLARE @date DateTime=null SET @date=CAST(CAST(@Year AS nvarchar) + ''-'' + CAST(@Month AS nvarchar) + ''-'' + ''1'' AS DATETIME); DECLARE @noofDays TINYINT DECLARE @CountForDate TINYINT SET @noofDays = DATEPART(MONTH,@date ) SET @CountForDate = 28 + (@noofDays + floor(@noofDays/8)) % 2 + 2 % @noofDays + 2 * floor(1/@noofDays) SET @noofDays= @CountForDate + CASE WHEN @CountForDate = 28 AND DATEPART(YEAR,@date)%4 =0 THEN 1 ELSE 0 END PRINT @noofDays


DECLARE @date DATETIME = GETDATE(); --or ''12/1/2018'' (month/day/year) SELECT EOMONTH ( @date ) AS ''This Month''; SELECT EOMONTH ( @date, 1 ) AS ''Next Month'';

resultado: este mes 2018-12-31

Mes siguiente 2019-01-31


DECLARE @date nvarchar(20) SET @date =''2012-02-09 00:00:00'' SELECT DATEDIFF(day,cast(replace(cast(YEAR(@date) as char)+''-''+cast(MONTH(@date) as char)+''-01'','' '','''')+'' 00:00:00'' as datetime),dateadd(month,1,cast(replace(cast(YEAR(@date) as char)+''-''+cast(MONTH(@date) as char)+''-01'','' '','''')+'' 00:00:00'' as datetime)))


SELECT DAY(SUBDATE(ADDDATE(CONCAT(YEAR(NOW()), ''-'', MONTH(NOW()), ''-1''), INTERVAL 1 MONTH), INTERVAL 1 DAY))

Nice ''n'' Simple y no requiere crear ninguna función


SELECT Datediff(day, (Convert(DateTime,Convert(varchar(2),Month(getdate()))+''/01/''+Convert(varchar(4),Year(getdate())))), (Convert(DateTime,Convert(varchar(2),Month(getdate())+1)+''/01/''+Convert(varchar(4),Year(getdate()))))) as [No.of Days in a Month]


select datediff(day, dateadd(day, 0, dateadd(month, ((2013 - 1900) * 12) + 3 - 1, 0)), dateadd(day, 0, dateadd(month, ((2013 - 1900) * 12) + 3, 0)) )

Nice Simple y no requiere crear ninguna función Work Fine