ВЫБРАТЬ, манипулировать данными, временно используя SQL Server - PullRequest
0 голосов
/ 09 августа 2011

В базе данных есть поле «дата окончания», и предполагается, что значение 1753/1/1 не представляет ничего, поскольку мы не можем присвоить ноль для datetime в SQL Server.

В приложении для отчетов используется запрос на выборку, который получает данные, включая эти 1753 значения даты. хороший

Задача

1753 Дата вызывает ад с расчетами отчета. В отчете много вычислений, и изменение кода на игнорирование 1753 будет головной болью, поэтому я подумал

Есть ли способ сообщить SQL Server:

SELECT * 
FROM TABLE BUT IN END_DATE 
WHERE VALUE='1753/1/1 01:00:00.000' REPLACE WITH PARAMETER1

РЕДАКТИРОВАНИЕ CRUDE (в настоящее время нет доступа к отладчику)

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

ничто не должно отображаться на что-либо

при попытке вставить запись с нулевой датой! ЭТО ПРОИСХОДИТ ТОЛЬКО ПРИ ИСПОЛЬЗОВАНИИ VB.NET в C #, он работает нормально. Ты знаешь почему ??

Ответы [ 5 ]

4 голосов
/ 09 августа 2011
SELECT * 
FROM TABLE
WHERE END_DATE = 
 CASE VALUE 
   WHEN VALUE = '1753/1/1 01:00:00.000' THEN PARAMETER1 
   ELSE VALUE
 END

РЕДАКТИРОВАТЬ: Ответ на комментарии

Нельзя назначить NULL полям DateTime, поскольку DateTime является типом значения, поэтому оно не может сохраняться NULL. Используйте SqlDateTime.NULL , чтобы передать значение NULL хранимой процедуре или самому запросу. Если вы можете предоставить код, который должен передавать NULL - я могу привести более подробный пример.

1 голос
/ 09 августа 2011

Хотя я думаю, что null следует использовать, чтобы указать, что что-то не имеет значения, вы можете попробовать:

SELECT MyDate = CASE END_DATE   
    WHEN '1753/1/1 01:00:00.000' THEN YourDefaultValue
    ELSE END_DATE
END 

Подробнее см. msdn .

0 голосов
/ 09 августа 2011

Я думаю, вы, вероятно, ищете что-то вроде этого (обратите внимание, что вы не можете сделать это с SELECT *; вам придется явно выбирать нужные столбцы, если вы не хотите добавить вычисляемый столбец, используя другое имя.)

SELECT 
   CASE 
      WHEN END_DATE = > '1753/1/1 01:00:00.000' THEN END_DATE 
      ELSE PARAMETER1 
   END 'END_DATE',
   other_columns...
FROM
   TABLE 

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

0 голосов
/ 09 августа 2011

Вам нужно использовать чехол

SELECT case when date_field = '1753/1/1 01:00:00.000' then @PARAMETER1
ELSE date_field END
FROM TABLE 
0 голосов
/ 09 августа 2011
    SELECT field1, field2, field3, 
        'NEW_END_DATE' = CASE CAST(END_DATE AS DATE) = '1753-1-1' 
             THEN @Parameter 
             ELSE END_DATE 
         END
    FROM TABLE;
...