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 ...
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