Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:获取不带幻数的最大/最小可能日期_Sql_Sql Server_Tsql_Date_Magic Numbers - Fatal编程技术网

SQL Server:获取不带幻数的最大/最小可能日期

SQL Server:获取不带幻数的最大/最小可能日期,sql,sql-server,tsql,date,magic-numbers,Sql,Sql Server,Tsql,Date,Magic Numbers,我知道SQL Server的定义范围为0001-01-01到9999-12-31。有没有什么方法可以使用T-SQL获得这些值而不使用幻数(例如,没有像declare@MaxDate='12/31/9999')这样的东西?你肯定不能得到最大值,但我刚刚了解到你也不能得到最小值 可以使用datetime类型执行此操作: SELECT CAST(0 AS datetime) --returns 1900-01-01 00:00:00.000 但不能使用日期类型: SELECT CAST(0 AS d

我知道SQL Server的定义范围为0001-01-01到9999-12-31。有没有什么方法可以使用T-SQL获得这些值而不使用幻数(例如,没有像
declare@MaxDate='12/31/9999'
)这样的东西?

你肯定不能得到最大值,但我刚刚了解到你也不能得到最小值

可以使用datetime类型执行此操作:

SELECT CAST(0 AS datetime)
--returns 1900-01-01 00:00:00.000
但不能使用日期类型:

SELECT CAST(0 AS date)
--returns Msg 529, Level 16, State 2, Line 1
--Explicit conversion from data type int to date is not allowed.

有一种绕道而行的方法。但你可以这样做:

DECLARE @dateHighest nvarchar(400), @dateLowest nvarchar(400)

SET @dateHighest = 'powershell.exe ((([System.Data.SqlTypes.SqlDateTime]::MaxValue).Value).ToString(\""MM/dd/yyyy\""))'

SET @dateLowest = 'powershell.exe ((([System.Data.SqlTypes.SqlDateTime]::MinValue).Value).ToString(\""MM/dd/yyyy\""))'

DECLARE @useTopDate table 
(
    highestDate date
)

DECLARE @useBottomDate table 
(
    lowestDate date
)


INSERT INTO @useBottomDate EXEC xp_cmdshell @dateLowest
INSERT INTO @useTopDate EXEC xp_cmdshell @dateHighest

SELECT TOP 1 * From @useTopDate, @useBottomDate

如果您在存储过程或函数中需要它,您可以稍后使用它。

因此,如果没有幻数,这是行不通的,但是如果您需要函数(我使用十六进制表示法,因为对于这么大的数字,它更紧凑,更容易阅读)

不过,在低端,SQL Server将允许1/1/1:

SELECT CAST('0001-01-01' AS DATE)

但不是负面日期(例如BC)。

你用
强制这些值是什么意思?
?问题是你为什么需要这些?这里有一些问题可能会给你一些启示:,可能重复@Mihai我的目的主要是学术性的。。。我发现C#类比(例如,
DateTime.MinValue
)非常有用,编写了一个可能会受益的查询,并且意识到我不知道它们是否可用。搜索谷歌没有得到有用的结果。太糟糕了。从各方面考虑,这是一个奇怪的选择——其意图非常明显。似乎最大值是…这将获得CLR最小值/最大值,不一定是SQL server配置的值。@DanField,是的,根据最后的注释,但在大多数情况下,它们应该是相同的,只是不确定询问者对此的使用情况。它们在
日期时间
上的最小值不同(但它们用于
日期
)。如果将PS更改为powershell.exe(([System.Data.SqlTypes.SqlDateTime]::MaxValue…
和MinValue),可能会更好。请参阅“立即编辑”,因为这是一个更优雅的解决方案,而且很好了解;)
SELECT CAST('0001-01-01' AS DATE)