Как отформатировать запрос с подстановочными знаками для дат в MS SQL?

У меня есть определенный диапазон дней, скажем, с 8-01 до 8-08. У меня также есть база данных с историческими данными за 1975-2014 годы. Даты форматируются в формате гггг-мм-дд. Например, сегодня 2014-08-06. Как я могу получить исторические записи с 8-01 по 8-08 за все годы? Имейте в виду, что мой диапазон дат может не охватывать один и тот же месяц. Другим примером может быть период с 31 июля по 07 августа.

По сути, я хочу иметь возможность делать МЕЖДУ (%-8-01 И%-8-08), где% является подстановочным знаком. Однако подстановочные знаки кажутся несовместимыми с объектами даты в MS SQL. Нужно ли мне преобразовывать даты в строки? Каков наиболее эффективный способ получить общий диапазон месяцев и дней независимо от года?

Спасибо.


person jenny    schedule 06.08.2014    source источник
comment
вам не нужно конвертировать в строку, попробуйте что-то вроде этого: SELECT * FROM Table WHERE DATEPART(MONTH, Table.Date) = 8 AND DATEPART(DAY, Table.Date) BETWEEN 1 AND 8   -  person deterministicFail    schedule 06.08.2014


Ответы (3)


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

SELECT *
FROM   Table1
WHERE  DATEADD
       (
           year,
           -DATEDIFF(year,'19000101',dateField),
           dateField
       ) BETWEEN'19000801' AND'19000818'
person Giannis Paraskevopoulos    schedule 06.08.2014

Вы можете извлечь часть месяца и даты и сравнить их:

where
month(<yourdate>) = 8
and day(<yourdate>) between 1 and 8

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

person Andrew    schedule 06.08.2014
comment
Это становится проблемой, когда даты охватывают несколько месяцев... но спасибо за понимание. - person jenny; 06.08.2014
comment
Просто используйте month(date) IN ... - person Andrew; 06.08.2014

Оператор подстановки нельзя использовать в операторе BETWEEN. Это действительно только для операторов LIKE. Если вы хотите иметь возможность изменить свой год и все, вы должны передать его в качестве параметра. Оператор BETWEEN примет это без проблем.

person durbnpoisn    schedule 06.08.2014