Подтвердить что ты не робот

Почему 1899-12-30 нулевая дата в Access/SQL Server вместо 12/31?

Больше из любопытства, чем любая реальная проблема; вопрос появился сегодня, и я знаю, что видел 1899-12-30 как "дефолтную" дату и нулевую дату в приложениях Access и старых SQL Server. Просто задавался вопросом, почему - откуда это взялось и почему не используется 1899-12-31?

4b9b3361

Ответ 1

Поддержание совместимости с Lotus 1-2-3 в тот же день, у которого была ошибка в том, что он думал, что год 1900 года был високосным годом (или притворился?).

Объяснение слишком длинное, чтобы процитировать, но ради любопытства, вот некоторые фрагменты.

1900 не был високосным годом.

"Это ошибка в Excel!" Я воскликнул.

"Ну, не совсем, - сказал Эд." Мы должны были сделать это, потому что нам нужно иметь возможность импортировать рабочие листы Lotus 123 ".

" Итак, это ошибка в Lotus 123? "

" Да, но, возможно, преднамеренный. Лотос должен был вписаться в 640 тыс. Это не так много памяти. Если вы проигнорируете 1900 год, вы можете выяснить, является ли данный год високосным годом, просто посмотрев, правые два бита равны нулю.Это очень быстро и просто. Лотос-ребята, вероятно, полагали, что неважно было неправильно в течение этих двух месяцев в прошлом. Похоже, что базовые парни хотели быть анальными в течение этих двух месяцев, поэтому они вернули эпоху в один прекрасный день ".

Фактически, это число больше, чем фактическое количество дней. Это связано с тем, что Excel ведет себя так, как если бы существовала дата 1900-Feb-29. Это не так. 1900 год не был високосным (2000 год - високосный год). В Excel, на следующий день после 1900-Feb-28, 1900-Feb-29. В действительности, на следующий день после 1900-февраля-28 был 1900-марта-1. Это не "ошибка". Действительно, это по дизайну. Excel работает так, потому что это действительно ошибка в Lotus 123. Когда Excel был представлен, 123 имеет почти весь рынок программного обеспечения для работы с электронными таблицами. Microsoft решила продолжить ошибку Lotus, чтобы полностью совместимо. Пользователи, которые перешли от 123 в Excel, не должны были вносить какие-либо изменения в свои данные. Пока все ваши даты позже, чем в 1900-марте-1, это не должно беспокоить.

Ответ 2

Насколько я знаю, тип даты не существовал в "старшем SQL Server". Он был введен в SQL Server 2008 с нулевым значением даты, соответствующим 0001/01/01.

select cast(0x000000 as date),cast(CONVERT(date, '0001/01/01') as varbinary(max)) 
----------     --------
--0001-01-01   0x000000

Утверждения вопросов не имеют смысла. Если тип даты существовал в "более старом SQL Server", это означало бы несогласованную обратную совместимость типа даты в SQL Server 2008.

Нет смысла отвечать (и сообщения о повышении) в вопросе с помощью undefined или некорректно определенных терминов.

Ответ 3

SQL Server, похоже, возвращает эту дату по умолчанию, если он не может связаться с указанным источником времени.

Это произошло во время инцидентов при сбое кластера, когда моя биометрическая система посещаемости времени работает/используется.

Чтобы победить локальные манипуляции с часами, у кого-то часы, я спрашиваю экземпляр кластера SQL в какое время.

Он не может получить действительный активный источник времени и возвращает эту дату.

Обходной путь для меня прямолинейный, проверяя эту дату в моем GetServerTime Sub и используя время локального ПК, если возвращается этот "по умолчанию".

Я видел это с SQL 2000/2005/2008, все через ADO и VB6.