Запрос таблицы измерений дат для диапазона дат - PullRequest
0 голосов
/ 05 декабря 2018

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

ID |Год |Месяц |День

Как запросить диапазон дат?Пример: я хочу получить даты с 03/02/2018 по 03/02/2020

Я пробовал следующее:

SELECT *
from Dates dateDim
where (dateDim.Year >= 2018 and dateDim.Month >= 2 and dateDim.Day  >= 3) 
  and (dateDim.Year <= 2020 and dateDim.Month <= 2 and dateDim.Day  <= 3);

Ответы [ 4 ]

0 голосов
/ 05 декабря 2018

В стандартном SQL вы можете сравнить кортежи (= несколько столбцов) с одним выражением:

select *
from dates
where (year, month, day) >= (2018,2,3) and (year, month, day) <= (2020, 1, 3);

Однако не все продукты СУБД поддерживают это, но вы не упомянули конкретный продукт СУБД и тегsql относится к «стандартному SQL».

Онлайн-пример: https://rextester.com/NTZH63192


Но вы должны действительно рассмотреть возможность изменить это на один столбец типаDATE.

0 голосов
/ 05 декабря 2018

Как уже было сказано, измените таблицу Dates, чтобы она действительно содержала типы DATE.Вы можете легко получить год / месяц / день от даты.Наиболее типичные операции, связанные с вашей таблицей дат, включают преобразование в дату, затем некоторые операции (например, добавление дней / месяцев и т. Д.), А затем обратное преобразование.Если вы храните эти отметки как даты, вы сохраняете первый шаг.Правильное хранение БД в течение всего срока службы спасет вас больше, чем любая ложная причина, по которой они хранятся, как это предназначено для помощи с

. Вы также можете сделать это математически (или строго):

SELECT * FROM dates WHERE year * 10000 + month * 100 + day BETWEEN 20180203 and 20200103

Но это немного неудачный взлом по сравнению с правильным хранением данных.

0 голосов
/ 05 декабря 2018

Если вы используете MS-SQL, я бы порекомендовал, если Год, Месяц и День являются INT, преобразовать их в DateTime и у вас гораздо больше контроля, должно быть что-то вроде этого:

SELECT 
    *
FROM
    Dates.dateDim AS foo
WHERE
     CAST(CAST(foo.Year AS varchar) + '-' + CAST(foo.Month AS varchar) + '-' + CAST(foo.Day AS varchar) AS DATETIME) BETWEEN '2018/02/03' AND '2020/02/03'
0 голосов
/ 05 декабря 2018
SELECT *
from Dates dateDim
where dateDim.Year * 10000 + dateDim.Month * 100 + dateDim.Day
      between 20180203 and 20200203
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...