Создать столбец даты из 3 строк в SQL - PullRequest
1 голос
/ 30 января 2020

У меня есть таблица с 3 столбцами:

(integer)    (integer)       (varchar(50))
  Month         Year            Color
    1           2019             Blue
    1           2019             Yellow
    1           2019             Red
    2           2019             Blue
    2           2019             White 

Моя конечная цель - сделать запрос, подобный следующему:

Select Color from table where (cast(concat(Year,'/',Month,'/1') as date)>='01/Jan/2019' and cast(concat(Year,'/',Month,'/1') as date)<'1/Mar/2019')

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

Я попытался сделать дату с помощью этого запроса, но он дает мне эту ошибку:

Select cast(concat(Year,'/',Month,'/1') as date) from table
Conversion failed when converting date and/or time from character string.

Решение:

Это последний запрос, который я использовал для получения дат в финансовом году с октября 2017 года по сентябрь 2018 года.

select distinct(DATEFROMPARTS(y,m,1))
from table
where 
(DATEFROMPARTS(y, m, 1) >= cast('2017-10-01' as date)) and (DATEFROMPARTS(y, m, 1) < cast('2018-10-01' as date))
order by DATEFROMPARTS(y,m,1) 

Редактировать

Отредактировано для переключения приведения на дату от 10 *

select distinct(DATEFROMPARTS(y,m,1))
from table
where 
(DATEFROMPARTS(y, m, 1) >= DATEFROMPARTS(2017, 10, 1)) and (DATEFROMPARTS(y,m, 1) < DATEFROMPARTS(2018, 10, 1))
order by DATEFROMPARTS(y,m,1)

1 Ответ

4 голосов
/ 30 января 2020

Вы можете использовать datefromparts():

select color 
from table 
where 
    datefromparts(year, month, 1) >= cast('20190101' as date)
    and datefromparts(year, month, 1) < cast('20190301' as date)

Или:

where 
    datefromparts(year, month, 1) >= datefromparts(2019, 1, 1)
    and datefromparts(year, month, 1) < datefromparts(2019, 3, 1)

Поскольку вы вводите дату в первую дату месяца, вы также можете использовать between вот так:

select color 
from table 
where datefromparts(year, month, 1) 
    between cast('20190101' as date) and cast('20190201' as date)

Или:

where datefromparts(year, month, 1) 
    between datefromparts(2019, 1, 1) and datefromparts(2019, 2, 1)

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

where year = 2019 and month in (1, 2)

Однако если ваш диапазон дат охватывает несколько лет, это будет утомительно и потребует более сложного выражения.

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