[英]How to get number of days from month and year
我想获取用户指定的月份中的天数。 我正在使用它,除了2月和leap年以外,大多数月份都可以使用。 它显示28天而不是29天。您能解决这个问题吗?
begin
declare @year int
declare @month int
select @year = 2012
select @month = DATEPART(mm,CAST('August'+ ' 2012' AS DATETIME))
select datediff(day,
dateadd(day, 0, dateadd(month, ((@year - 2012) * 12) + @month - 1, 0)),
dateadd(day, 0, dateadd(month, ((@year - 2012) * 12) + @month, 0))) as number_of_days
end
或者,如果不能,您可以告诉我另一种方法来执行此操作。 它应该使用@year
和@month
并且找到日期的代码可以是任意的!
如果您需要从年份和月份开始(假设两者都是整数),则可以这样创建一个函数:
CREATE FUNCTION dbo.DaysInMonth (@year INT, @Month INT)
RETURNS INT
AS
BEGIN
-- FIRST CONVERT THE YEAR AND MONTH TO A DATE BY CASTING TO CHAR
-- THEN CONCATENATING TO CREATE A STRING IN THE FORMAT yyyyMMdd
-- THIS DATEFORMAT IS CULTURE INSENSITIVE SO WILL WORK NO MATTER
-- WHAT YOUR REGIONAL SETTINGS ARE
DECLARE @Date DATE = CAST(
CAST(@Year AS CHAR(4))
+ RIGHT('0' + CAST(@Month AS VARCHAR(2)), 2)
+ '01' AS DATE);
-- USE ESTABLISHED METHODS OF GETTING 1ST OF THE MONTH AND FIRST OF
-- THE NEXT MONTH AND CALCULATE THE DIFFERENCE
RETURN DATEDIFF(DAY,
DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date), 0),
DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date) + 1, 0));
END
GO
-- TEST FUNCTION
SELECT DaysInMonth = dbo.DaysInMonth(2012, 2);
这将是一个很好的解决方案。
DECLARE @year INT,@month INT
SET @year = 2011
SET @month = 2
SELECT DAY(EOMONTH(DATEFROMPARTS(@year,@month,1)))
为SQL Server 2005修改的Gareth解决方案
CREATE FUNCTION dbo.DaysInMonth (@year INT, @Month INT)
RETURNS INT
AS
BEGIN
-- FIRST CONVERT THE YEAR AND MONTH TO A DATE BY CASTING TO CHAR
-- THEN CONCATENATING TO CREATE A STRING IN THE FORMAT yyyyMMdd
-- THIS DATEFORMAT IS CULTURE INSENSITIVE SO WILL WORK NO MATTER
-- WHAT YOUR REGIONAL SETTINGS ARE
DECLARE @Date datetime
SET @DATE = CAST(
CAST(@Year AS CHAR(4))
+ RIGHT('0' + CAST(@Month AS VARCHAR(2)), 2)
+ '01' AS DATETIME);
-- USE ESTABLISHED METHODS OF GETTING 1ST OF THE MONTH AND FIRST OF
-- THE NEXT MONTH AND CALCULATE THE DIFFERENCE
RETURN DATEDIFF(DAY,
DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date), 0),
DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date) + 1, 0));
END
GO
然后,您所需要做的就是获取所需的输入,将其转换为存储在@date中的日期,然后您可以使用该帖子中的第一个示例,而无需进行任何更改。 照原样使用您的代码,只需要再进行一行转换,然后执行第一个解决方案:
declare @year int
declare @month int
declare @date date
select @year = 2012
select @month = DATEPART(mm,CAST('august'+ ' 2012' AS DATETIME))
select @date = cast(cast(@month as varchar(20)) + '/1/' + cast(@year as varchar(4)) as datetime)
select @month, datediff(day, dateadd(day, 1-day(@date), @date),
dateadd(month, 1, dateadd(day, 1-day(@date), @date)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.