WHERE, чтобы найти все записи за определенный месяц
Я хочу, чтобы иметь возможность хранить хранимую процедуру месяц и год, и вернуть ли она все, что происходит в этом месяце, как это сделать, поскольку я не могу сравнивать между тем, как несколько месяцев имеют разные количества дней и т.д.?
Какой лучший способ сделать это? Могу ли я просто попросить сравнить в зависимости от года и месяца?
Спасибо.
Ответы
Ответ 1
Я думаю, что функция, которую вы ищете, MONTH(date)
. Вероятно, вы захотите использовать 'YEAR'.
Предположим, что у вас есть таблица с именем things
, которая выглядит примерно так:
id happend_at
-- ----------------
1 2009-01-01 12:08
2 2009-02-01 12:00
3 2009-01-12 09:40
4 2009-01-29 17:55
И позвольте сказать, что вы хотите выполнить, чтобы найти все записи, имеющие happened_at
в течение месяца 2009/01 (январь 2009). Запрос SQL:
SELECT id FROM things
WHERE MONTH(happened_at) = 1 AND YEAR(happened_at) = 2009
Что будет возвращено:
id
---
1
3
4
Ответ 2
Использование функций MONTH и YEAR, предложенных в большинстве ответов, имеет тот недостаток, что 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)[email protected],@Day-1)
end
go
Затем запрос будет выглядеть следующим образом:
SELECT ... FROM ...
WHERE DateColumn >= Date(@Year,@Month,1)
AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))
Ответ 3
Если вы используете SQL Server, загляните в DATEPART.
http://msdn.microsoft.com/en-us/library/ms174420(SQL.90).aspx
DATEPART (мм, [ДАТА, ВЫ ИЩЕТЕ НА])
Затем вы можете использовать с ним нормальную целочисленную логику. То же самое в течение года, просто используйте yy вместо mm.
Ответ 4
В качестве альтернативы функциям MONTH и YEAR будет также работать регулярное предложение WHERE:
select *
from yourtable
where '2009-01-01' <= datecolumn and datecolumn < '2009-02-01'
Ответ 5
Еще один совет очень прост. Вы также можете использовать функцию to_char, посмотрите:
В течение месяца:
to_char (used_at, 'MM') = 01
На год:
to_char (used_at, 'YYYY') = 2009
День:
to_char (used_at, 'DD') = 01
to_char funcion поддерживается словом sql, а не одной конкретной базой данных.
Я надеюсь, что кто-нибудь еще поможет...
Abs!
Ответ 6
Мне легче передать значение в виде временного типа данных (например, 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')
Ответ 7
Вы можете получить данные для конкретных титров Year and Month из таблицы.
Выберите * из tablename, где YEAR (columnname
) = '2017' AND MONTH (columnname
) = '11'
Ответ 8
Можно ли просто попросить сравнить в зависимости от года и месяца?
Вы можете. Вот простой пример с использованием базы данных примеров 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
Ответ 9
Что-то вроде этого должно это сделать:
select * from yourtable where datepart(month,field) = @month and datepart(year,field) = @year
В качестве альтернативы вы можете разделить месяц и год на свои собственные столбцы при создании записи, а затем выбрать против них.
Иэйн
Ответ 10
Один из способов - создать переменную, которая представляет первый из месяца (т.е. 5/1/2009), либо передать ее в proc, либо построить (concatenate month/1/year). Затем используйте функцию DateDiff.
WHERE DateDiff(m,@Date,DateField) = 0
Это вернет что-нибудь с соответствующим месяцем и годом.
Ответ 11
SELECT * FROM yourtable WHERE yourtimestampfield LIKE 'AAAA-MM%';
Где AAAA
- год, который вы хотите, и MM
- месяц, который вы хотите