2013-06-26 7 views
1

Я хочу получить количество дней в месяце, который указывает пользователь. Я использую это, он работает в течение большинства месяцев, кроме февраля и високосного года. Это показывает 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 -to-define-the-number-of-days-in-a-month-in-sql-server) – kwwallpe

+0

Да, я видел этот пост, но в этом посте. Все использовали getdate(), или они вводят дату. Я хочу ввести год и месяц отдельно! –

ответ

0

Затем все, что вам нужно сделать, это взять нужные вам данные, отбросить их до даты, хранящейся в @date, и вы можете использовать первый пример от 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

Gareth решение модифицирована для 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