ошибка при выполнении запроса с проверкой даты в предложении where - PullRequest
0 голосов
/ 12 марта 2020

У меня есть таблица со значениями года и месяца, сохраненными в виде столбцов типа данных 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))

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

Ответы [ 3 ]

1 голос
/ 12 марта 2020

Из-за проблем с данными, возможно, используйте try_convert() с concat()

Пример

Declare @YourTable Table ([Year] int,[Month] int)  
Insert Into @YourTable Values 
 (2020,1)
,(2020,1)
,(2020,2)
,(2020,222)

Select * 
      ,try_convert(date,concat([Year],'/',[Month],'/', 1))
 From @YourTable

Возвращает

Year    Month   (No column name)
2020    1       2020-01-01
2020    1       2020-01-01
2020    2       2020-02-01
2020    222     NULL          << There's a problem
1 голос
/ 12 марта 2020

Не указывайте 23:

WHERE DATEFROMPARTS([Year], [Month], 1) < convert(date, getdate())

Возможно, у вас проблема с настройками интернационализации. Ваша версия конвертирует getdate() в строку и обратно в дату.

0 голосов
/ 13 марта 2020

DATEFROMPARTS(YEAR,MONTH,DAY) вернет значение в формате DATE.

Просто CAST параметр, с которым вы хотите сравнить его, в том же формате. Затем вы сравниваете форматы того же типа.

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

SELECT DISTINCT DATEFROMPARTS([Year], [Month], 1) 
FROM MyTable 
WHERE DATEFROMPARTS([Year], [Month], 1) < CAST(GETDATE() as DATE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...