Получение всей записи за конкретный месяц - Построение SQL-запроса - PullRequest
0 голосов
/ 13 января 2010

Мне нужна помощь для создания SQL-запроса.У меня есть таблица с такими данными:

ID  Date        Name
1   1/1/2009    a
2   1/2/2009    b
3   1/3/2009    c

Мне нужно получить результат примерно как ...

1    1/1/2009    a
2   1/2/2009    b
3   1/3/2009    c
4   1/4/2009    Null
5   1/5/2009    Null
6   1/6/2009    Null
7   1/7/2009    Null
8   1/8/2009    Null
............................
............................
............................
30  1/30/2009   Null
31  1/31/2009   Null

Я хочу запрос что-то вроде ..

Select * from tbl **where month(Date)=1 AND year(Date)=2010**

Выше не завершен запрос.

Мне нужно получить всю запись за конкретный месяц, даже если какая-то дата отсутствует.

Я полагаю, что в запросе должно быть равнопытаясь построить этот запрос, используя Equi join

Спасибо

Ответы [ 3 ]

5 голосов
/ 13 января 2010

БОЛЬШОЕ РЕДАКТИРОВАНИЕ

Теперь разберитесь с ОП.

Используйте общее табличное выражение и левое соединение, чтобы получить этот эффект.

DECLARE @FirstDay DATETIME;

-- Set start time
SELECT @FirstDay = '2009-01-01';

WITH Days AS 
(
  SELECT @FirstDay as CalendarDay
  UNION ALL
  SELECT DATEADD(d, 1, CalendarDay) as CalendarDay
  FROM Days
  WHERE DATEADD(d, 1, CalendarDay) < DATEADD(m, 1, @FirstDay)
)
SELECT DATEPART(d,d.CalendarDay), **t.date should be (d.CalendarDay)**, t.Name  FROM Days d
LEFT JOIN tbl t
ON
  d.CalendarDay = t.Date
ORDER BY 
  d.CalendarDay;

Оставил этот оригинальный ответ внизу

Вам нужно DATEPART , сэр.

SELECT * FROM tbl WHERE DATEPART(m,Date) = 1

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

SELECT * FROM tbl WHERE DATEPART(m,Date) = 1 AND DATEPART(yyyy,Date) = 2009

Диапазон: -

SELECT * FROM tbl WHERE Date >= '2009-01-01' AND Date < '2009-02-01'

См. Эту ссылку для получения дополнительной информации о DATEPART.

http://msdn.microsoft.com/en-us/library/ms174420.aspx

1 голос
/ 13 января 2010

Создать временную таблицу, содержащую все дни этого определенного месяца,

Выполните левое внешнее соединение между этой таблицей и таблицей данных в tempTable.month = # month.

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

Надеюсь, ты этого хочешь.

1 голос
/ 13 января 2010

Вы можете использовать меньше или равно.

Примерно так:

select * from tbl where date > '2009-01-01' and date < '2009-02-01'

Однако неясно, хотите ли вы месяц 1 от всех лет?

Выможете проверить больше примеров и функций в « Функции даты и времени » из MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...