2015-10-12 5 views
1

У меня есть таблица кода пакета, которая содержит коды, которые я использую для обозначения определенных периодов даты. Однако есть несколько дат, для которых не существует записи в таблице управления. Для этого я хочу использовать значение по умолчанию в таблице, имеющей год «9999». Однако, когда я пытаюсь изменить год, я получаю ошибку преобразования.Ошибка преобразования при разборе даты

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

/* Works */ 
DECLARE @Date date 
SET @Date = '2015-09-20' 
SELECT CAST('9999' + '-' + CAST(MONTH(@Date) AS varchar) + '-' + CAST(DAY(@Date) AS varchar) AS date) 

Конверсия удалось при преобразовании даты и/или времени из строки символов.

/* Conversion error */ 
    SELECT 
      EndDate, 
      CASE 
       WHEN (SELECT BatchCd FROM BatchCodeMGMT WHERE Orders.EXITDATE BETWEEN BatchStartDt AND BatchEndDt AND RegionBInd = 0) IS NULL THEN 
        (SELECT BatchCd FROM BatchCodeMGMT WHERE --We set the year to the default year which is 9999 and compare them going backwards 
         CONVERT(date,('9999' + '-' + 
           CAST(MONTH(Orders.EndDate) AS varchar) + '-' + 
           CAST(DAY(Orders.EndDate) AS varchar) 
         )) 
        BETWEEN BatchStartDt AND BatchEndDt AND AdultEdInd = 0) 
       ELSE 
        (SELECT BatchCd FROM BatchCodeMGMT WHERE Orders.EXITDATE BETWEEN BatchStartDt AND BatchEndDt AND AdultEdInd = 0) 
      END BatchCd 
     FROM Orders 

В таблице код партии более или менее, как это, все столбцы не являются nullble, а также. Поэтому для даты в Приказе «2013-09-15» я бы хотел, чтобы она была изменена на «9999-09-15» и использовала ее для выбора кода партии из таблицы.

------------------------------------- 
|BatchCd | BatchStart | BatchEnd | 
------------------------------------- 
| Pr2 | 9999-01-16 | 9999-06-14 | 
| Pr1 | 9999-06-15 | 9999-01-15 | 
| Pr2 | 2015-01-16 | 2015-06-14 | 
| Pr1 | 2015-06-15 | 2015-08-15 | 
------------------------------------- 

Редактировать: Я понимаю, что могут возникнуть проблемы при наличии совпадающих дат. Однако для этой таблицы этого не должно быть.

+0

У вас есть несколько строк, где Order.EndDate имеет значение NULL? –

+0

Я согласен с приведенными выше. Предварительно не рекомендуется использовать значение «фиктивного» столбца, чтобы указать, что он не существует. Вы должны объявить его как «с нулями» и вставить значение NULL для дат, которые не существуют. –

+0

@TabAlleman Нет, столбец объявлен как null. – adc90

ответ

0

Возможно, вам нужно сообщить команде convert точно, как вы форматировали данные. Он видит #### - ## - ##, но он не видит инструкций, говорящих, что это yyyy-mm-dd. Посмотрите на таблицу здесь: https://msdn.microsoft.com/en-us/library/ms187928.aspx

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

Смежные вопросы