2012-05-10 2 views
3

Использование Microsoft SQL 2008. У меня есть две таблицы, которые я хочу выбрать с текущей даты до первого дня этого месяца (или в течение одного месяца) , Предположим, что сегодняшняя дата - 05/09/2012, а столбец даты - «datecolumn». Fom, приведенные ниже таблицы, я должен получить только строки с наборами 6,7 из таблицы 1 и набора строк 9,2 из таблицы 2, поскольку эти даты относятся к тому же месяцу, что и 05/09/2012.Выберите диапазон дат из двух таблиц от настоящего дня до первого дня этого месяца

table1 
4 02/01/2012 
5 01/02/2011 
6 05/01/2012 
7 05/20/2012 

table2 
8 02/01/2012 
9 05/14/2012 
3 01/02/2011 
2 05/18/2012 

Я попытался это, но он не работал:

DECLARE @daterange 
SET @daterange = (DATEPART(MONTH,GETDATE()) + '/' + DATEPART(YEAR,GETDATE())) 

SELECT blah from table where (DATEPART(MONTH,datecolumn) + '/' + DATEPART(YEAR,datecolumn)) = @daterange 
+0

Что делать, если на столе2 есть строка 10 с датой 15.05.2012 , какой будет выход? –

+0

Действительно, если это так (сопоставление всех записей за месяц), нет необходимости указывать диапазон в заголовке –

+0

В таблице будут отображаться только даты в тот день, когда выполняется другая хранимая процедура. Не будет никаких будущих дат. Извините, если я смутил кого-нибудь. Я пытался быть уверенным, что возвращенные строки были в пределах этого месяца и не превышали первый или последний месяц того дня, когда запрос выполнялся. – Patriotec

ответ

1

Вы можете упростить его, нет необходимости восстановить поле даты из GETDATE():

SELECT blah 
FROM table 
WHERE DATEPART(MONTH,datecolumn) = DATEPART(MONTH,getdate()) AND 
DATEPART(YEAR,datecolumn) = DATEPART(YEAR,getdate()) 
+0

У вас и Андрея не было никакой разницы в производительности для запроса. Потрясающие. Спасибо. – Patriotec

0

Как насчет определения начала и конец текущего месяца, а затем выбор для записей между ними:

declare @monthBeginning datetime 
set @monthBeginning = (select dateadd(dd,-(day(dateadd(mm,1,getdate()))-1),dateadd(mm,0,getdate())) 

declare @monthEnd datetime 
set @monthEnd = (select dateadd(dd, -day(dateadd(m,1,getdate())), dateadd(m,1,getdate()))) 

select * 
from dateTable 
where datecolumn between @monthBeginning and @monthEnd 

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

+0

Вы забыли поместить имена переменных в свои утверждения присваивания. Во всяком случае, это кажется несколько сложным, и вам, вероятно, нужно что-то сделать с временными частями (то есть сбросить их до «00: 00'). –

0

Вы можете получить первый из текущего месяца, как это:

DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) 

Добавляя один месяц до указанного выше результата, вы получите первый из следующего месяца:

DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0) 

Используя эти две даты, вы можете получить требуемые строки следующим образом:

SELECT 
    … 
FROM table1 
WHERE date >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) , 0) 
    AND date < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0) 
+0

Спасибо за помощь. Вы и hkf имели такую ​​же производительность по статистике SQL. Вы код отличный, потому что он пригодится для работы балансов (т. Е. 3months, 6months диапазонов). Еще раз спасибо. – Patriotec

Смежные вопросы