Ошибка функции SQL при преобразовании нулевой даты в строку - PullRequest
1 голос
/ 22 октября 2011

Я использую базу данных Adventureworks2008R2 и пытаюсь сделать следующее. У меня проблема с предложением Case в запросе SQL.

Конечная дата в таблице имеет тип данных date

SELECT  
         Firstname,
            Lastname, 
            Startdate,
            'END DATE' =
              CASE   
                WHEN (ENDDATE is  null) Then 'Still Working'
                ELSE EndDate
               END
FROM 
     DIMEMPLOYEE

Это ошибка, которую я получаю.

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

Я знаю, почему это происходит, но не знаю, как это исправить? Обновление:

Все, что мне нужно, это когда endate не равен NULL, тогда замените этот столбец на «все еще работающую» строку.

Ответы [ 3 ]

4 голосов
/ 23 октября 2011

Поместит CAST в столбец EndDate, чтобы помочь вам здесь.Я думаю, что оператор CASE определяет столбец с типом данных string.

CASE
WHEN (EndDate IS NULL) THEN 'Still working'
ELSE CAST(EndDate AS VARCHAR)
END
1 голос
/ 23 октября 2011

FWIW, вот соответствующая CASE документация:

Типы данных input_expression и каждого when_expression должны быть одинаковыми или должны быть неявным преобразованием ... [а также] типы данных else_result_expression и любого result_expression должны быть одинаковыми или неявным преобразованием .


Ответ на:

Почему я должен преобразовать его в Varchar, поскольку я не храню данные в базе данных, Select должен отобразить его?

Причина, по которой это требование (в CASE имеется фиксированный тип результата), заключается в том, что каждая запись (кортеж) в наборе результатов должна иметь одинаковый тип. Явное принуждение к VARCHAR, как указано в других ответах, «расширяет» данные до общего типа.

Схема для результирующего набора отделена от данных самого результирующего набора и (по крайней мере в не-OORDMBS) является инвариантной (сам оператор CASE является контравариантным посредством неявных преобразований ) - это «просто способ работы SQL», и не имеет значения, передается ли набор результатов в другое select / join или обратно клиенту. «Клиент» вполне может быть другим сервером, выполняющим удаленный запрос; -)

Представьте себе этот недопустимый набор результатов (который отклоняет SQL Server):

schema: {int, date}
{1: int, 2001.10.22: date}
{2: int, "Hello world": string} <-- misshaped record! must agree with schema!

Счастливого кодирования.

0 голосов
/ 23 октября 2011

Вы также можете использовать коалесц

     Coalesc(cast(enddate as varchar), 'still working')
...