是否有像GETDATE()
Sql Server 2005这样的函数让你获得最大可能日期?
我不想在表格中找到最高日期.我想获得sql server能够存储的最大可能日期.
基本上,我想要一个永不过期的日期
该文件表示,范围是1753年1月1日,通过9999年12月31日.
我不认为有内置函数,但您可以创建一个返回最大日期时间值的函数.
CREATE FUNCTION fn_max_date RETURNS datetime AS return cast('12/31/9999 23:59:59.9999' as datetime)
在我的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.
CAST似乎依赖于SQL Server语言/文化.
在我的德语 SQL Server 2008 R2和2012(@@language = 'Deutsch'
)上,以下转换会引发错误:
CAST('12/31/9999 23:59:59.997' AS DATETIME)
将varchar数据类型转换为日期时间数据类型会导致超出范围的值.
虽然这个工作得很好:
CAST('31.12.9999 23:59:59.997' AS DATETIME)
解
我认为最安全的方法是使用CONVERT指定格式:
/* ISO 8601 */ CONVERT(DATETIME, '9999-12-31T23:59:59.997', 126)
请参阅文档.
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
我正在为这个问题创建一个新的答案,只是为了解决scottm其他很好的接受答案的一些小问题.
根据该文档时,的maximium值时的一个组成部分datetime
其实是"23:59:59.997 ",因此使用的值"23:59:59.999"实际上将四舍五入到半夜,第二天.如果日期部分已经在9999年12月31日给出,那么这将尝试向上舍入到10000年1月1日,这会产生超出范围的错误.
https://msdn.microsoft.com/en-us/library/ms187819(v=sql.105).aspx说:
日期范围:1753年1月1日至9999年12月31日
时间范围:00:00:00至23:59:59.997
使用的日期文字是美国格式,虽然这些文字在12月31日不含糊,但最好使用ISO格式.Nitpicky也许,但我发现mm/dd/yyyy格式的阅读日期非常不直观,我怀疑我并不孤单.
SQL需要将函数体包含在BEGIN/END块中,因此无法创建示例.
所以我的最大DateTime函数的改进版本是:
CREATE FUNCTION fnMaxDateTime() RETURNS DateTime AS BEGIN RETURN CAST('9999-12-31 23:59:59.997' AS DateTime) END