SQL Server:获取不带幻数的最大/最小可能日期
我知道SQL Server的定义范围为0001-01-01到9999-12-31。有没有什么方法可以使用T-SQL获得这些值而不使用幻数(例如,没有像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
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)