После прочтения вашего комментария я провел некоторое копание и тестирование, и хотя я не смог найти официальную документацию по этому поводу, вы правы, и приведение к дате делает значение обнуляемым, даже если дата и время не обнуляются.Я даже попробовал другой метод, используя datetimefromparts
для создания типа данных даты, но это также изменяет обнуляемость результата.
Так что, как я вижу, у вас есть два варианта:
Первый вариант - добавить в таблицу постоянный вычисляемый столбец, который будет содержать значение даты даты транзакции.Это должно быть сохранено, чтобы быть не обнуляемым:
ALTER TABLE RetailTransaction
ADD TransactionDateOnly AS CAST(TransactionDate As Date) PERSISTED NOT NULL;
, и тогда ваш запрос будет выглядеть так:
SELECT TransactionDateOnly as TransactionDate
FROM RetailTransaction
Другой вариант - объявить переменную таблицы с ненулевым значением.Обнуляемый столбец даты, выберите результаты приведения в него, а затем выберите из табличной переменной:
DECLARE @Target AS TABLE
(
TransactionDate Date NOT NULL
)
INSERT INTO @Target(TransactionDate)
SELECT CAST(TransactionDate as Date)
FROM RetailTransaction) t
И тогда ваш выбор будет выглядеть следующим образом:
SELECT TransactionDate
FROM @Target
В обоих случаях вы получитев результате необнуляемая дата, но я думаю, что опция сохраняемого вычисляемого столбца, вероятно, должна дать лучшую производительность для выбора, потому что он не требует дополнительной вставки ... выбора.