преобразование типа данных varchar в тип данных datetime привело к значению вне диапазона: ТОЛЬКО для високосного года - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь вставить дату в столбец datetime после форматирования getdate () tovarchar (8) с помощью функции convert. Я вижу, что это работает по большей части, но между прочим, когда date является високосной датой (29 февраля), происходит сбой с преобразованием varchar в datetime error.

Я изменил varchar (8) на varchar (9), что в итоге решило проблему , Любая идея, если 29 февраля хранится по-другому на SQL сервере?

CREATE TABLE [dbo].[temp_insert]
(
[TimeStamp] [datetime] NULL,
) ON [PRIMARY]

GO

insert into temp_insert values(convert(varchar(8),(getdate()+1),113))--*inserts 1st march 2020*

GO

insert into temp_insert values(convert(varchar(8),(getdate()),113))--*fails with conversion error*

GO

insert into temp_insert values(convert(varchar(9),(getdate()),113))--*giving 9 bytes in varchar, inserts 29th Feb without issues.*


GO

select * from temp_insert--*shows 2 rows including 29th feb leap day*

GO

Ответы [ 2 ]

2 голосов
/ 29 февраля 2020

Если вы возьмете INSERT, который потерпел неудачу сам по себе, и разбил его на части, становится совершенно очевидно, в чем проблема.

Это не удалось, потому что convert(varchar(8),(getdate()),113) возвращает varchar '29 Feb 2'. Если вы возьмете значение '28 Feb 2' и преобразуете его в datetime, вы получите значение 2002-02-28 00:00:00.000; er go '29 Feb 2' будет 29 февраля 2002 года. 2002 год не был високосным, поэтому конверсия не удалась.

0 голосов
/ 29 февраля 2020

Это не способ сделать это. Ваша таблица уже имеет поле даты и времени, поэтому нет необходимости использовать convert для таких значений, как getdate (), поскольку они уже имеют тип datetime .

Просто store значения в качестве даты и времени, затем используйте функцию FORMAT до рендеринг дату / время так, как вы хотите.

Используйте функцию DATEADD вместо, например DATEADD(day, 1, getdate()). И имейте в виду, что использование зарезервированных ключевых слов (здесь: TIMESTAMP) - это то, чего следует избегать.

...