2013-06-26 93 views
1

我想獲取用戶指定的月份中的天數。我使用它可以在2月和閏年之外的大多數月份都有效。它顯示了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和代碼來查找日期可以是任何!

+1

有在[答案在這裏(有很多的解決方案http://stackoverflow.com/questions/691022/how要確定的月份在SQL服務器中的天數) – kwwallpe

+0

是的男人我看到那篇文章,但在該帖子。每個人都使用getdate(),或者他們正在輸入日期。我想單獨輸入年份和月份! –

回答

0

然後,您只需將所需的輸入內容轉換爲日期存儲的日期,即可使用that post中的第一個示例,而不進行任何更改。使用你的代碼按,只需要鑄造一個多行,然後第一個解決方案:

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))) 
+0

對於日期格式設置爲「DMY」的情況,這會失敗。如果你打算使用這種格式,你需要明確聲明'SET DATEFORMAT MDY;'。更好的是使用文化不敏感的日期格式yyyyMMdd。 – GarethD

3

如果您需要從年份和月份做到這一點(假設兩者都是整數),你可以創建一個功能所以:

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); 

Example on SQL Fiddle

1

這將是一個很好的解決方案。

DECLARE @year INT,@month INT 

SET @year = 2011 
SET @month = 2 

SELECT DAY(EOMONTH(DATEFROMPARTS(@year,@month,1))) 
1

加雷思解決方案修改SQL Server 2005的

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 
相關問題