найти максимально возможную дату в MS SQL Server 2005+ - PullRequest
34 голосов
/ 14 февраля 2009

Есть ли в Sql Server 2005 функция, подобная GETDATE(), которая позволяет получить максимально возможную дату?

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

В принципе, я хочу, чтобы срок годности никогда не был

Ответы [ 7 ]

43 голосов
/ 14 февраля 2009

В документации говорится, что диапазон - с 1 января 1753 года по 31 декабря 9999 года.

Я не думаю, что есть встроенная функция, но вы можете создать такую, которая возвращает максимальное значение даты и времени.

CREATE FUNCTION fn_max_date
RETURNS datetime
AS
return cast('12/31/9999 23:59:59.9999' as datetime)
12 голосов
/ 16 октября 2014

В моем SQL Server 2008 r2 я получаю эти странные результаты (не то, чтобы я когда-нибудь пропустил эти 3 миллисекунды)

SELECT cast('12/31/9999 23:59:59.997' as datetime) --RETURNS '9999-12-31 23:59:59.997'
SELECT cast('12/31/9999 23:59:59.998' as datetime) --RETURNS '9999-12-31 23:59:59.997'
SELECT cast('12/31/9999 23:59:59.999' as datetime) --RETURNS The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
9 голосов
/ 09 ноября 2016

CAST зависит от языка и культуры SQL Server.

На моих Немецких SQL Server 2008 R2 и 2012 (@@language = 'Deutsch') следующее приведение приводит к ошибке:

CAST('12/31/9999 23:59:59.997' AS DATETIME)

Преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона.

Принимая во внимание, что этот работает отлично:

CAST('31.12.9999 23:59:59.997' AS DATETIME)

РЕШЕНИЕ

Я думаю, что самый безопасный подход - указать формат с помощью CONVERT:

/* ISO 8601 */
CONVERT(DATETIME, '9999-12-31T23:59:59.997', 126)
8 голосов
/ 14 февраля 2009

Обратитесь к документации.

http://msdn.microsoft.com/en-us/library/ms187819.aspx

Date range
January 1, 1753, through December 31, 9999

Нет способа получить максимальное время / дату программно.

Если так, то это будет указано здесь:

http://msdn.microsoft.com/en-us/library/ms186724.aspx

5 голосов
/ 15 июля 2016

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

  1. Согласно документам, максимальное значение time компонента datetime на самом деле равно «23: 59: 59. 997 », поэтому при использовании значения « 23: 59: 59.999 "фактически закроется до полуночи следующего дня. Если часть даты уже указана как 31 декабря 9999 г., она будет пытаться округлить до 1 января 10000 г., что приведет к ошибке вне диапазона.

https://msdn.microsoft.com/en-us/library/ms187819(v=sql.105).aspx говорит:

Диапазон дат: с 1 января 1753 г. по 31 декабря 9999

Диапазон времени: с 00:00:00 до 23: 59: 59,997

  1. Используемые литералы даты представлены в формате США, и хотя они не являются неоднозначными для 31 декабря, лучше всего использовать формат ISO. Плохо, но я нахожу даты чтения в формате мм / дд / гггг не очень понятными, и я подозреваю, что я не одинок.

  2. В SQL необходимо, чтобы тело функции содержалось в блоке BEGIN / END, поэтому при написании пример создать не удалось.

Итак, моя улучшенная версия функции max DateTime:

CREATE FUNCTION fnMaxDateTime()
RETURNS DateTime
AS
BEGIN
    RETURN CAST('9999-12-31 23:59:59.997' AS DateTime)
END
1 голос
/ 14 февраля 2009

Если вы действительно хотите, чтобы дата истечения срока действия «никогда», лучше хранить NULL, а не произвольную дату в далеком будущем. Хотя маловероятно, что дата достигнет 9999 года без кода, который был бы «исправлен», нелогично хранить значение EndDate = never.

0 голосов
/ 14 февраля 2009

1 января 1753 года, до 31 декабря 9999 года

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