Поиск максимально возможной даты в ms sql server 2005+
Есть ли в Sql Server 2005 функция типа GETDATE()
, которая позволяет вам получить максимально возможную дату?
Я не хочу найти самую высокую дату в таблице. Я хочу получить максимально возможную дату, которую сервер sql сможет хранить.
В принципе, мне нужна дата истечения срока действия
Ответы
Ответ 1
Документация говорит, что диапазон составляет 1 января 1753 года, до 31 декабря 9999 года.
Я не думаю, что есть встроенная функция, но вы можете создать тот, который возвращает максимальное значение datetime.
CREATE FUNCTION fn_max_date
RETURNS datetime
AS
return cast('12/31/9999 23:59:59.9999' as datetime)
Ответ 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.
Ответ 3
Обратитесь к документации.
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
Ответ 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
-
Используемые литераторы даты используются в формате США, и хотя они не являются двусмысленными для 31-го декабря, лучше всего использовать формат ISO. Возможно, Nitpicky, но я считаю даты показа в формате mm/dd/yyyy очень неинтуитивными, и я подозреваю, что я не один.
-
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 года.