Подтвердить что ты не робот

WHERE, чтобы найти все записи за определенный месяц

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

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

Спасибо.

4b9b3361

Ответ 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 - месяц, который вы хотите