在ms sql server 2005+中查找最大可能日期

时间:2009-02-14 02:20:27

标签: sql sql-server

在Sql Server 2005中是否有像GETDATE()这样的函数让你获得最大可能日期?

我不想在表格中找到最高日期。我想获得sql server能够存储的最大可能日期。

基本上,我希望到期日永远不会

7 个答案:

答案 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

无法以编程方式获取最大日期时间。

如果是这样,它将在此处列出:

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

答案 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否则接受的答案中的一些小问题。

  1. 根据文档,datetime time 组件的最大值实际上是“23:59:59。 997 ”,所以使用值“23:59:59.999”实际上会在第二天午夜结束。如果日期部分已经在9999年12月31日给出,那么这将尝试向上舍入到10000年1月1日,这会产生超出范围的错误。
  2. 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

    1. 使用的日期文字采用美国格式,虽然这些文字在12月31日不含糊,但最好使用ISO格式。 Nitpicky也许,但我发现mm / dd / yyyy格式的阅读日期非常不直观,我怀疑我并不孤单。

    2. SQL需要将函数体包含在BEGIN / END块中,因此无法创建示例。

    3. 所以我的最新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日