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

Поиск максимально возможной даты в ms sql server 2005+

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

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

В принципе, мне нужна дата истечения срока действия

4b9b3361

Ответ 2

В моем 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.

Ответ 4

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

  • В соответствии с документами максимальное значение временной составляющей a 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. Возможно, Nitpicky, но я считаю даты показа в формате mm/dd/yyyy очень неинтуитивными, и я подозреваю, что я не один.

  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

Ответ 5

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)

Ответ 6

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

Ответ 7

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