Как вставить NULL в поле DATETIME вместо 1900-01-01 00: 00: 00.000 в SQL Server - PullRequest
0 голосов
/ 16 октября 2018

Я новичок в SQL Server, здесь я пытаюсь вставить дату в столбец с типом данных DATETIME.

Когда я передаю дату и время в хранимую процедуру из API, она вставляет значения, которые яПрошло.Но если я передаю пустую строку " ", она вставляет значение по умолчанию 1900-01-01 00:00:00.000.Но я хочу вставить NULL, если данные " ".

Я много гуглил, но не могу найти решение для этого.

@DATEVAL1 DATETIME = '',
@DATEVAL1 DATETIME = ''

INSERT INTO TABLE (mDate1, mDate2)
VALUES (@DATEVAL1, @DATEVAL2);

Это кодУ меня в хранимой процедуре.

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Даты и строки - это не одно и то же.По какой-то причине SQL Server преобразует пустую строку в значение даты '1900-01-01 00:00:00.000', а не генерирует ошибку.

Мой основной совет - не использовать пустые строки для дат.Вместо этого просто используйте NULL:

DECLARE @DATEVAL1 DATETIME = NULL;
DECLARE @DATEVAL1 DATETIME = NULL;

INSERT INTO TABLE (mDate1, mDate2)
    VALUES (@DATEVAL1, @DATEVAL2);

Если по какой-то причине вам нужно использовать пустые строки, то вы можете использовать триггер для преобразования значения 1900 в NULL или использовать NULLIF() вINSERT:

INSERT INTO TABLE (mDate1, mDate2)
    VALUES (NULLIF(@DATEVAL1, ''), NULLIF(@DATEVAL2, ''));
0 голосов
/ 16 октября 2018

Я пойду в другом направлении, как и два других ответа.

Полагаю, у вас есть приложение с выпадающими списками или текстовыми полями.Ваше приложение вызывает ваш API, а затем вы отправляете эти значения в хранимую процедуру.Иногда приложение отправляет пустую строку, и когда вы отправляете их в хранимую процедуру, они преобразуются в 1900-01-01.

Так что если у вас есть следующая хранимая процедура:

CREATE PROCEDURE dbo.InsertDate 
    @DATEVAL1 DATETIME, @DATEVAL1 DATETIME
AS
    INSERT INTO TABLE (mDate1, mDate2) 
    VALUES (@DATEVAL1, @DATEVAL2);
GO

В этом случае, еслиотправив '' в хранимую процедуру, вы получите 1900-01-01 в момент создания параметров, поскольку происходит неявное преобразование, поэтому NULLIF() здесь не будет работать.

Вы можете добавить некоторую логику IF () к хранимой процедуре, чтобы преобразовать любой 1900-01-01 в NULL перед запуском INSERT

Или вы можете добавить логику в преобразование API.любой от '' до NULL перед вызовом хранимой процедуры.

0 голосов
/ 16 октября 2018

Когда вы устанавливаете переменную datetime в пустую строку, происходит неявное преобразование.И пустая строка неявно преобразуется в 1900-01-01.Либо просто объявите переменную и не присваивайте им значение, либо явно присвойте им значение NULL.

@DATEVAL1 DATETIME,
@DATEVAL2 DATETIME = NULL

Или вы можете использовать NULLIF.Поскольку вы получаете эти значения из API, вам, скорее всего, придется использовать NULLIF.В противном случае изменение в вызове API потребуется для отправки значения NULL вместо пустой строки.

Values( NULLIF(@DATEVAL1, '')
...