在Sql Server 2005中是否有像GETDATE()
这样的函数让你获得最大可能日期?
我不想在表格中找到最高日期。我想获得sql server能够存储的最大可能日期。
基本上,我希望到期日永远不会
答案 0 :(得分:42)
documentation表示范围是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)
答案 1 :(得分:12)
在我的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.
答案 2 :(得分:8)
查阅文档。
http://msdn.microsoft.com/en-us/library/ms187819.aspx
Date range
January 1, 1753, through December 31, 9999
无法以编程方式获取最大日期时间。
如果是这样,它将在此处列出:
答案 3 :(得分:8)
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)
答案 4 :(得分:5)
我正在为这个问题创建一个新的答案,只是为了解决scottm否则接受的答案中的一些小问题。
datetime
的 time 组件的最大值实际上是“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
答案 5 :(得分:1)
如果您确实希望过期日期为“never”,那么存储NULL而不是任意远期日期可能会更好。如果没有代码被“修复”,日期不可能达到9999年,那么存储EndDate = never是不合逻辑的价值。
答案 6 :(得分:0)
1753年1月1日至9999年12月31日