ГДЕ пункт, чтобы найти все записи в конкретном месяце - PullRequest
63 голосов
/ 12 мая 2009

Я хочу предоставить хранимой процедуре месяц и год, чтобы она возвращала все, что происходит в этом месяце, как мне это сделать, поскольку я не могу сравнить, поскольку в некоторых месяцах разное количество дней и т. Д.?

Какой лучший способ сделать это? Могу ли я просто попросить сравнить по году и месяцу?

Спасибо.

Ответы [ 10 ]

149 голосов
/ 12 мая 2009

Я думаю, что функция, которую вы ищете, это 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
12 голосов
/ 12 мая 2009

Использование функций 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)+@Month-1,@Day-1)
    end
go

Запрос становится:

SELECT ... FROM ...
WHERE DateColumn >= Date(@Year,@Month,1)
AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))
3 голосов
/ 25 сентября 2014

Еще один совет, очень просто. Вы также можете использовать функцию to_char , смотрите:

за месяц:

to_char (случилось_ат, 'ММ') = 01

На год:
to_char (случилось_ат, «ГГГГ») = 2009

За день:
to_char (случилось_ат, 'ДД') = 01

to_char Функция поддерживается языком SQL, а не одной конкретной базой данных.

Надеюсь, помогу кому-нибудь еще ...

Abs!

2 голосов
/ 12 мая 2009

В качестве альтернативы функциям MONTH и YEAR также будет работать обычное предложение WHERE:

select *
from yourtable
where '2009-01-01' <= datecolumn and datecolumn < '2009-02-01'
2 голосов
/ 12 мая 2009

Если вы используете SQL Server, изучите DATEPART.

http://msdn.microsoft.com/en-us/library/ms174420(SQL.90).aspx

DATEPART (мм, [дата, на которую вы смотрите])

Затем вы можете использовать обычную целочисленную логику. То же самое для года, просто используйте yy вместо mm.

1 голос
/ 12 мая 2009

Мне проще передать значение в качестве временного типа данных (например, 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')
0 голосов
/ 05 августа 2015
SELECT * FROM yourtable WHERE yourtimestampfield LIKE 'AAAA-MM%';

Где AAAA - это год, который вы хотите, а MM - это месяц, который вы хотите

0 голосов
/ 12 мая 2009

Один из способов - создать переменную, представляющую первое число месяца (т. Е. 01.05.2009), либо передать ее в процедуру, либо создать ее (объединить месяц / 1 / год). Затем используйте функцию DateDiff.

WHERE DateDiff(m,@Date,DateField) = 0

Это вернет что-либо с соответствующим месяцем и годом.

0 голосов
/ 12 мая 2009

Что-то вроде этого должно сделать это:

select * from yourtable where datepart(month,field) = @month and datepart(year,field) = @year

В качестве альтернативы вы можете разделить месяц и год на их собственные столбцы при создании записи, а затем выбрать их.

Иэн

0 голосов
/ 12 мая 2009

Могу ли я просто попросить сравнить по году и месяцу?

Можно. Вот простой пример использования образца базы данных 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...