Фильтровать по названию месяца - PullRequest
0 голосов
/ 22 июня 2011

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

SELECT  (CONVERT(varchar(3), DATENAME(month, w.ExpectedStartDate)) +  '-' +     CONVERT(VARCHAR(15), datepart(yyyy, w.ExpectedStartDate))) as MonthName

    FROM Worksheet w LEFT OUTER JOIN StatusType st ON st.StatusTypeId = w.StatusTypeId
    WHERE w.ProjectId = 20
    AND CONVERT(varchar(3), DATENAME(month, w.ExpectedStartDate)) between ('Jan')     AND ('Apr')

Когда я преобразую его в это:

SELECT  (CONVERT(varchar(3), DATENAME(month, w.ExpectedStartDate)) +  '-' +     CONVERT(VARCHAR(15), datepart(yyyy, w.ExpectedStartDate))) as MonthName

        FROM Worksheet w LEFT OUTER JOIN StatusType st ON st.StatusTypeId = w.StatusTypeId
        WHERE w.ProjectId = 20
        AND CONVERT(varchar(3), DATENAME(month, w.ExpectedStartDate)) between ('Jan')     AND ('Mar')

Я только что изменил ToMonth = Mar, а не апрель, тогда он показывает мне запись, которая является правильной, потому что есть данные для марта. за апрель почему ничего не видно?

Пожалуйста, дайте ваше предложение.

Спасибо.

Ответы [ 5 ]

3 голосов
/ 22 июня 2011

Мне кажется, вам не нравится тот факт, что вы использовали МЕЖДУ строками; строка «Apr» предшествует строке «Jan», поэтому она не работает, но строка «Mar» идет после строки «Jan».

0 голосов
/ 22 июня 2011

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

ALTER TABLE dbo.Worksheet 
  ADD YearMonth AS 
        RIGHT('0000' + CAST(YEAR(ExpectedStartDate) AS VARCHAR(4)), 4) + 
        RIGHT('00' + CAST(MONTH(ExpectedStartDate) AS VARCHAR(2)), 2) PERSISTED

Это добавит к вашей таблице новый столбец YearMonth, который всегда актуален, всегда точен и сохраняется, например. хранится на диске, так что это быстро, вы даже можете поместить индекс в этот столбец!

Этот столбец будет содержать такие значения, как

201103
201104

и т. Д. - год (четыре цифры) и месяц (две цифры, ведущий ноль) вашего ExpectedStartDate

Таким образом, чтобы выбрать все проекты на январь 2011 года, вы можете определить:

 SELECT (list of columns)
 FROM dbo.Worksheet
 WHERE YearMonth = '201101'

и получите именно эти строки очень быстро - особенно если вы индексируете этот столбец.

0 голосов
/ 22 июня 2011

Для точности используйте этот код

w.ExpectedStartDate>='20110101' and ExpectedStartDate<'20110105'
0 голосов
/ 22 июня 2011
AND MONTH(w.ExpectedStartDate)>=1 AND MONTH(w.ExpectedStartDate)<=4
0 голосов
/ 22 июня 2011

Вы можете использовать Месяц (w.ExpectedStartDate) между 1 И 4

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