我需要确定SQL Server中给定日期的一个月天数。
是否有内置功能?如果没有,我应该将什么用作用户定义的函数?
答案 0 :(得分:131)
在SQL Server 2012中,您可以使用EOMONTH (Transact-SQL)来获取该月的最后一天,然后您可以使用DAY (Transact-SQL)来获取该月的天数。
DECLARE @ADate DATETIME
SET @ADate = GETDATE()
SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth
答案 1 :(得分:110)
您可以在指定月份的第一天使用以下内容:
datediff(day, @date, dateadd(month, 1, @date))
使其适用于每个日期:
datediff(day, dateadd(day, 1-day(@date), @date),
dateadd(month, 1, dateadd(day, 1-day(@date), @date)))
答案 2 :(得分:22)
最优雅的解决方案:适用于任何 @DATE
DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,@DATE),0)))
将其丢入函数或直接使用它。这回答了原始问题而没有其他答案中的所有额外垃圾。
其他答案的日期示例:
SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'1/31/2009'),0)))
返回31
SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'2404-feb-15'),0)))
返回29
SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'2011-12-22'),0)))
返回31
答案 3 :(得分:17)
更简单...尝试day(eomonth(@Date))
答案 4 :(得分:11)
--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)))
就个人而言,如果没有内置函数,我会为它制作一个UDF ...
答案 5 :(得分:6)
我建议:
SELECT DAY(EOMONTH(GETDATE()))
答案 6 :(得分:3)
此代码可获取当月的天数:
SELECT datediff(dd,getdate(),dateadd(mm,1,getdate())) as datas
将getdate()
更改为您需要计算天数的日期。
答案 7 :(得分:1)
select add_months(trunc(sysdate,'MM'),1) - trunc(sysdate,'MM') from dual;
答案 8 :(得分:1)
解决方案1:查找我们目前所在月份的天数
DECLARE @dt datetime
SET @dt = getdate()
SELECT @dt AS [DateTime],
DAY(DATEADD(mm, DATEDIFF(mm, -1, @dt), -1)) AS [Days in Month]
解决方案2:查找给定月份组合中的天数
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]
答案 9 :(得分:1)
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]
答案 10 :(得分:1)
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,不需要创建任何功能正常工作
答案 11 :(得分:1)
&&
答案 12 :(得分:1)
你需要添加一个功能,但它很简单。我用这个:
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
答案 13 :(得分:1)
您需要创建一个功能,但这是为了您自己的方便。它工作得很完美,我从未遇到任何使用此函数的错误计算。
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
工作原理:从日期本身中减去日期的天数,可以得到上个月的最后一天。因此,您需要在给定日期添加一个月,减去日期编号并获取结果的日期部分。
答案 14 :(得分:0)
DECLARE @m int
SET @m = 2
SELECT
@m AS [Month],
DATEDIFF(DAY,
DATEADD(DAY, 0, DATEADD(m, +@m -1, 0)),
DATEADD(DAY, 0, DATEADD(m,+ @m, 0))
) AS [Days in Month]
答案 15 :(得分:0)
RETURN day(dateadd(month, 12 * @year + @month - 22800, -1))
select day(dateadd(month, 12 * year(date) + month(date) - 22800, -1))
答案 16 :(得分:0)
获得不。我们可以在一个月内直接使用SQL中的Day()。
按照我在SQL Server 2005/2008的答案末尾发布的链接。
以下示例和结果来自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')
SQL Server SSMS中的结果
(no column name)
1 31
过程:
使用EOMONTH时,无论使用哪种日期格式,都会转换为SQL-server的DateTime格式。那么EOMONTH()的日期输出将是2016-12-31,2016年为年,12为月,31为天。 传递到Day()时的输出会为您提供当月的总天数。
如果我们想获得检查的即时结果,我们可以直接运行以下代码,
select DAY(EOMONTH(convert(datetime,'08/12/2016',103)))
或
select DAY(EOMONTH(convert(datetime,getdate(),103)))
有关在SQL Server 2005/2008/2012中工作的参考,请按照以下外部链接...
答案 17 :(得分:0)
一种更简洁的实现方式是使用 datefromparts
函数构造一个月的第一天,并从那里计算天数。
CREATE FUNCTION [dbo].[fn_DaysInMonth]
(
@year INT,
@month INT
)
RETURNS INT
AS
BEGIN
IF @month < 1 OR @month > 12 RETURN NULL;
IF @year < 1753 OR @year > 9998 RETURN NULL;
DECLARE @firstDay DATE = datefromparts(@year, @month, 1);
DECLARE @lastDay DATE = dateadd(month, 1, @firstDay);
RETURN datediff(day, @firstDay, @lastDay);
END
GO
同样,您可以计算一年中的天数:
CREATE FUNCTION [dbo].[fn_DaysInYear]
(
@year INT
)
RETURNS INT
AS
BEGIN
IF @year < 1753 OR @year > 9998 RETURN NULL;
DECLARE @firstDay DATE = datefromparts(@year, 1, 1);
DECLARE @lastDay DATE = dateadd(year, 1, @firstDay);
RETURN datediff(day, @firstDay, @lastDay);
END
GO
答案 18 :(得分:0)
Mehrdad Afshari的答复是最准确的,除了通常这个答案是基于Curtis McEnroe在他的博客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
答案 19 :(得分:0)
SELECT DAY(SUBDATE(ADDDATE(CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-1'), INTERVAL 1 MONTH), INTERVAL 1 DAY))
很好'n'简单,不需要创建任何功能
答案 20 :(得分:0)
我知道这个问题很老但我想我会分享我正在使用的东西。
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
和
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
如果需要,可以将这些组合起来创建一个函数来检索一个月内的天数。
答案 21 :(得分:0)
这是另一个......
Select Day(DateAdd(day, -Day(DateAdd(month, 1, getdate())),
DateAdd(month, 1, getdate())))
答案 22 :(得分:0)
我赞成了Mehrdad,但这也有效。 :)
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
测试
declare @testDT datetime;
set @testDT = '2404-feb-15';
select dbo.GetDaysInMonth(@testDT)
答案 23 :(得分:-1)
SQLServer2012中的简单查询:
选择日(('20-05-1951 22:00:00'))
我测试了很多日期,它总是返回正确的结果
答案 24 :(得分:-1)
选择first_day = dateadd(dd,-1 * datepart(dd,getdate())+ 1,getdate()), LAST_DAY = DATEADD(DD,-1 *日期部分(DD,DATEADD(毫米,1,GETDATE())),DATEADD(毫米,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(毫米,1,GETDATE())))
用getdate替换任何日期以获取该特定日期的月份数
答案 25 :(得分:-1)
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)))
答案 26 :(得分:-1)
DECLARE @date DATETIME = GETDATE(); --or '12/1/2018' (month/day/year)
SELECT DAY(EOMONTH ( @date )) AS 'This Month';
SELECT DAY(EOMONTH ( @date, 1 )) AS 'Next Month';
结果: 这个月 31
下个月 30
答案 27 :(得分:-1)
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
答案 28 :(得分:-1)
任何日期
select DateDiff(Day,@date,DateAdd(month,1,@date))