У меня есть таблица со значениями года и месяца, сохраненными в виде столбцов типа данных int [Год] и [Месяц] соответственно. Мне нужно запросить таблицу, ограничивающую вывод определенной датой, используя предложение WHERE. Я придумал решение, использующее функцию DATEFROMPARTS (избегает многократных преобразований типов данных), которая отлично работает в предложении SELECT (количество отдельных дат ограничено, поэтому я могу проверить все из них), но не удается, когда я пытаюсь использовать составная дата в предложении WHERE.
Таким образом, запрос типа
SELECT DISTINCT DATEFROMPARTS([Year], [Month], 1) FROM MyTable
дает
2019-04-01
2019-05-01
2019-06-01
2019-07-01
2019-08-01
2019-09-01
2019-10-01
2019-11-01
2019-12-01
2020-01-01
2020-02-01
2020-03-01
, но когда я добавляю предложение WHERE, например
SELECT DISTINCT DATEFROMPARTS([Year], [Month], 1) FROM MyTable
WHERE DATEFROMPARTS([Year], [Month], 1) < convert(date, getdate(), 23)
или
SELECT DISTINCT DATEFROMPARTS([Year], [Month], 1) FROM MyTable
WHERE DATEFROMPARTS([Year], [MonthNumber], 1) < convert (date, '2019-12-01', 23)
Я получаю сообщение об ошибке:
Невозможно создать дату типа данных, некоторые аргументы имеют недопустимые значения.
Я использую SQL Server Ver. 13
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ Данные хранятся на удаленном SQL сервере, к которому я получаю доступ с облачной машины. Это представление, на которое у меня нет прав, только для чтения и дальнейшего использования в процессе ETL. В столбцах Год и Месяц есть нет недопустимых значений, таких как NULL, Месяц> 12 и т. Д. c.
ОБНОВЛЕНИЕ Я пробовал аналогичный сценарий на SQL Server 2016:
CREATE TABLE MyTable(
[Year] [int] NULL,
[Month] [int] NULL)
INSERT INTO MyTable
([Year], [Month])
VALUES
(2019, 9)
,(2019, 10)
,(2019, 11)
,(2019, 12)
,(2020, 1)
,(2020, 2)
,(2020, 3)
,(2020, 4)
Комбинация DATEFROMPARTS или объединение дат даты и преобразование в дату различных форматов не работает, в лучшем случае дата выглядит хорошо только в формате гггг-мм-дд, но не удается сравнить с функцией getdate ().
Решение, предложенное @ John-Cappelletti, помогло решить исходную проблему:
try_convert(date, concat([Year],'/',[Month],'/', 1))
, хотя мне все еще непонятно, почему это не так можно преобразовать объединенную дату в разные стили даты.