当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《在mssqlserver2005+中查找最大可能日期》经验,为你挑选了5个好方法。

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

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

基本上,我想要一个永不过期的日期



1> scottm..:

该文件表示,范围是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)


正如Tommy Heath在他的回答中提到的,试图投射'12/31/9999 23:59:59.9999'会导致超出范围值错误(至少在SQL 2008中).根据文档,日期时间的最大*时间*值是"23:59:59.997" - 所以使用".999~"将尝试将其四舍五入到第二天,即10000年!
我一直以为这些都是非常奇怪的选择.我宁愿能够在1753年之前使用多年,而不是在2400年之后使用多年.
准确性也很奇怪,文档说它是"累加到.000,.003或.007秒的增量"
我认为这是因为哪些国家在1753年之前更改为公历
尽管此方法的一般结构是正确的,但仍有一些问题。仅当服务器的区域设置为“美国”且使用的日期时间的精度不正确时,它才起作用。

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.


这看起来像一个观察而不是答案
该文档还指出[Accurancy被舍入为.000,.003或.007秒的增量](http://msdn.microsoft.com/en-us/library/ms187819.aspx)

3> marsze..:

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> Jim Counts..:

请参阅文档.

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



5> beercohol..:

我正在为这个问题创建一个新的答案,只是为了解决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

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有