Я хочу иметь возможность дать хранимой процедуре месяц и год и вернуть все, что происходит в этом месяце, как мне это сделать, поскольку я не могу сравнивать, поскольку в некоторых месяцах разное количество дней и т. Д.?
Как лучше всего это сделать? Могу я просто попросить сравнить по году и месяцу?
Благодарю.
sql
sql-server-2008
Tarks
источник
источник
Использование функций МЕСЯЦ и ГОД, как предлагается в большинстве ответов, имеет тот недостаток, что SQL Server не сможет использовать какой-либо индекс, который может быть в вашем столбце даты. Это может снизить производительность на большом столе.
Я был бы склонен передать значение DATETIME (например, @StartDate) в хранимую процедуру, которая представляет первый день интересующего вас месяца.
Затем вы можете использовать
SELECT ... FROM ... WHERE DateColumn >= @StartDate AND DateColumn < DATEADD(month, 1, @StartDate)
Если вы должны передать месяц и год как отдельные параметры в хранимую процедуру, вы можете сгенерировать DATETIME, представляющую первый день месяца, с помощью CAST и CONVERT, а затем действуйте, как указано выше. Если вы сделаете это, я бы рекомендовал написать функцию, которая генерирует DATETIME из целых значений года, месяца, дня, например, следующее из блога SQL Server .
create function Date(@Year int, @Month int, @Day int) returns datetime as begin return dateadd(month,((@Year-1900)*12)+@Month-1,@Day-1) end go
Тогда запрос становится:
SELECT ... FROM ... WHERE DateColumn >= Date(@Year,@Month,1) AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))
источник
@EndDate
сделает это явным.Еще один совет очень простой. Вы также можете использовать функцию to_char , посмотрите:
На месяц:
На год:
На день:
Функция to_char поддерживается языком sql, а не одной конкретной базой данных.
Я надеюсь помочь кому-нибудь еще ...
Абс!
источник
В качестве альтернативы функциям MONTH и YEAR также будет работать обычное предложение WHERE:
select * from yourtable where '2009-01-01' <= datecolumn and datecolumn < '2009-02-01'
источник
Если вы используете SQL Server, загляните в DATEPART.
http://msdn.microsoft.com/en-us/library/ms174420(SQL.90).aspx
DATEPART (мм, [ДАТА, НА КОТОРОЙ ВЫ СМОТРИТЕ])
Затем вы можете использовать с ним обычную целочисленную логику. То же самое для года, просто используйте yy вместо mm.
источник
Вы можете. Вот простой пример с использованием образца базы данных AdventureWorks ...
DECLARE @Year INT DECLARE @Month INT SET @Year = 2002 SET @Month = 6 SELECT [pch].* FROM [Production].[ProductCostHistory] pch WHERE YEAR([pch].[ModifiedDate]) = @Year AND MONTH([pch].[ModifiedDate]) = @Month
источник
Мне легче передать значение как временный тип данных (например
DATETIME
), а затем использовать временные функции, в частности,DATEADD
иDATEPART
найти даты начала и окончания периода, в данном случае месяц, например, это находит пару даты начала и даты окончания для текущего месяца просто замените свойCURRENT_TIMESTAMP
параметр типаDATETIME
(обратите внимание, что значение 1990-01-01 совершенно произвольно):SELECT DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-01T00:00:00.000'), DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-31T23:59:59.997')
источник
Что-то вроде этого должно сработать:
select * from yourtable where datepart(month,field) = @month and datepart(year,field) = @year
В качестве альтернативы вы можете разделить месяц и год на отдельные столбцы при создании записи, а затем выбрать их.
Иэн
источник
Один из способов - создать переменную, представляющую первое число месяца (т.е. 5/1/2009), либо передать ее в процесс, либо построить (объединить месяц / 1 / год). Затем используйте функцию DateDiff.
Это вернет что-нибудь с соответствующим месяцем и годом.
источник
SELECT * FROM yourtable WHERE yourtimestampfield LIKE 'AAAA-MM%';
Где
AAAA
год, который вы хотите, иMM
какой месяц вы хотитеисточник