【问题标题】:SQL Server : get max/min possible date without magic numbersSQL Server:在没有幻数的情况下获取最大/最小可能日期
【发布时间】:2023-03-10 19:05:01
【问题描述】:

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

【问题讨论】:

标签: sql sql-server tsql date magic-numbers


【解决方案1】:

您肯定无法获得最大值,但我也刚刚了解到您也无法获得最小值。

您可以使用 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.

【讨论】:

  • 太糟糕了。奇怪的选择,考虑到所有事情 - 意图非常明显。似乎最大值是out of reach as well...
【解决方案2】:

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

SELECT CAST(CAST(CAST(0x2D247f AS BIGINT) AS DATETIME) AS DATE) --, CAST(0x2D247f AS BIGINT)
SELECT CAST(CAST(CAST(0xD1BA AS BIGINT) * -1 AS DATETIME) AS DATE) --, CAST(0xD1BA AS BIGINT) * -1

虽然,在低端,SQL Server 将允许 1/1/1:

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

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

【讨论】:

    【解决方案3】:

    有一种关于获取方式的回合。但你可以这样做:

    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
    

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

    【讨论】:

    • 这将获得 CLR 最小值/最大值,不一定是 SQL 服务器的配置。
    • @DanField,是的,根据最后的注释,但在大多数情况下它们应该是相同的,只是不确定提问者的用例。
    • 它们与 Datetime 上的 MinValue 不同(但它们适用于 date)。如果您将 PS 更改为 'powershell.exe (([System.Data.SqlTypes.SqlDateTime]::MaxValue... 和 MinValue,它可能会更好。见stackoverflow.com/questions/3310569/…
    • 现在编辑,因为它是一个更优雅的解决方案并且值得了解 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多