Как ведет себя столбец даты и времени, когда столбец содержит пустое значение? - PullRequest
0 голосов
/ 03 мая 2019

Я столкнулся с некоторой проблемой, когда я передал пустое значение в переменную времени даты, которая хранится в качестве даты по умолчанию (1900-01-01 00: 00: 00.000)

я написал условное утверждение, что

declare @l_date datetime = '',@l_date1 datetime = getdate()

if @l_date <> ''
   select 'Yes' as '@l_date',@l_date D
else
   select 'No' as '@l_date',@l_date D

if @l_date1 <> ''
    select 'Yes' as '@l_date1',@l_date1 D
else
    select 'No' as '@l_date1',@l_date1 D

Я ожидал, что оба должны вернуть «Да». К сожалению, первое условие возвращает «Нет», а второе условие возвращает «Да». Может кто-нибудь объяснить функциональность, как это работает.

Ответы [ 3 ]

2 голосов
/ 03 мая 2019

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

DECLARE
     @datetime datetime = ''
    ,@smalldatetime smalldatetime = ''
    ,@datetime2 datetime2 = ''
    ,@date date = ''
    ,@time time = ''
    ,@datetimeoffset datetimeoffset = ''
SELECT
     @datetime AS datetime
    ,@smalldatetime AS smalldatetime
    ,@datetime2 AS datetime2
    ,@date AS date
    ,@time AS time
    ,@datetimeoffset AS datetimeoffset;

Результат:

+-------------------------+---------------------+-----------------------------+------------+------------------+------------------------------------+
|        datetime         |    smalldatetime    |          datetime2          |    date    |       time       |           datetimeoffset           |
+-------------------------+---------------------+-----------------------------+------------+------------------+------------------------------------+
| 1900-01-01 00:00:00.000 | 1900-01-01 00:00:00 | 1900-01-01 00:00:00.0000000 | 1900-01-01 | 00:00:00.0000000 | 1900-01-01 00:00:00.0000000 +00:00 |
+-------------------------+---------------------+-----------------------------+------------+------------------+------------------------------------+

Хотя вместо пустой строки иногда используется ноль для обозначения значения по умолчанию, это не разрешено для более новых datetime2, date, time и datetimeoffset типов.

2 голосов
/ 03 мая 2019

Нет значения '' для datetime.'' будет неявно приведен к значению 19000101, как вы видели.если у вас есть неизвестная дата, используйте NULL (NULL означает «неизвестно» в конце концов).Это изменит ваше утверждение на:

DECLARE @l_date datetime, --I don't set the value as it'll already be NULL
        @l_date1 datetime = GETDATE();

IF @l_date IS NOT NULL 
    SELECT 'Yes' AS [@l_date],
           @l_date AS D;
ELSE
    SELECT 'No' AS [@l_date],
           @l_date AS D;

IF @l_date1 IS NOT NULL 
    SELECT 'Yes' AS [@l_date1],
           @l_date1 AS D;
ELSE
    SELECT 'No' AS [@l_date1],
           @l_date1 AS D;

(Обратите внимание, что по-прежнему возвращается 'No' и 'Yes' соответственно.)

0 голосов
/ 03 мая 2019

Вы можете попробовать это


declare @l_date datetime=0 ,@l_date1 datetime = getdate()

if @l_date IS NOT NULL
   select 'Yes' as '@l_date',@l_date D
else
   select 'No' as '@l_date',@l_date D

if @l_date1 IS NOT NULL
    select 'Yes' as '@l_date1',@l_date1 D
else
    select 'No' as '@l_date1',@l_date1 D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...