代码之家  ›  专栏  ›  技术社区  ›  Axarydax

以编程方式获取SQL中浮点的最大值

  •  18
  • Axarydax  · 技术社区  · 15 年前

    有没有以编程方式 (在T-SQL中) 是否检索数据类型的最大值(和最小值)?它会表现得像 最大值浮标 在C语言中。

    当参数不等于数据库中的任何实际值时,我希望在某些选择中使用它,因此我将使用

    declare @min float
    declare @max float
    --fill @min and @max, can be null if undefined
    select * from foo 
      where bar between isnull(@min,0 ) and isnull(@max,max(float)/*magic*/)
    
    4 回复  |  直到 8 年前
        1
  •  21
  •   SqlRyan    15 年前

    虽然没有任何内联方法来获取最小值或最大值, there's a solution somebody put together :

     CREATE TABLE datatype_extrema 
      (min_bit bit NOT NULL DEFAULT (0) CHECK (min_Bit=0) 
      ,max_bit           AS CAST(0x1 AS bit) 
      ,min_tinyint       AS CAST(0x00 AS tinyint) 
      ,max_tinyint       AS CAST(0xFF AS tinyint) 
      ,min_smallint      AS CAST(0x8000 AS smallint) 
      ,max_smallint      AS CAST(0x7FFF AS smallint) 
      ,min_int           AS CAST(0x80000000 AS int) 
      ,max_int           AS CAST(0x7FFFFFFF AS int) 
      ,min_bigint        AS CAST(0x8000000000000000 AS bigint) 
      ,max_bigint        AS CAST(0x7FFFFFFFFFFFFFFF AS bigint) 
      ,min_smalldatetime AS CAST('19000101 00:00' AS smalldatetime) 
      ,max_smalldatetime AS CAST('20790606 23:59' AS smalldatetime) 
      ,min_datetime      AS CAST('17530101 00:00:00.000' AS datetime) 
      ,max_datetime      AS CAST('99991231 23:59:59.997' AS datetime) 
      ) 
      INSERT INTO datatype_extrema DEFAULT VALUES 
      GO 
      CREATE TRIGGER nochange_datatype_extrema 
      ON datatype_extrema INSTEAD OF INSERT, UPDATE, DELETE 
      AS BEGIN 
        RAISERROR ('No changes allowed for table datatype_extrema.', 16, 1) 
        ROLLBACK TRANSACTION 
      END 
      GO 
    

    之后,您可以将最大值复制到局部变量,或者 (使用查询时)与此表交叉联接。

      Declare @max_int int 
      Set @max_int=(SELECT max_int FROM datatype_extrema) 
      IF COALESCE(@FirstInt, @max_int) < COALESCE(@SecondInt, 0) 
    
        2
  •  11
  •   Oliver    13 年前

    下面是float和real类型的默认值(在接受的答案中缺少):

    select
        CAST('-1.79E+308' AS float) as MinFloat,
        CAST('1.79E+308' AS float) as MaxFloat,
        CAST('-3.40E+38' AS real) as MinReal,
        CAST('3.40E+38' AS real) as MaxReal
    

    不幸的是,无法从varbinary转换它们,但是varchar工作时没有任何问题。

        3
  •  3
  •   Anthony Faull    11 年前

    为了 float real 这个 最大值 可以使用 POWER 功能:

    SELECT
        max_float = (1 + (POWER(2e0, 52) - 1) / POWER(2e0, 52)) * POWER(2e0, 1023)
        , min_float = -(1 + (POWER(2e0, 52) - 1) / POWER(2e0, 52)) * POWER(2e0, 1023)
        , max_real = CAST((1 + (POWER(2e0,23)-1)/POWER(2e0,23)) * POWER(2e0,127) AS real)
        , min_real = CAST(-(1 + (POWER(2e0,23)-1)/POWER(2e0,23)) * POWER(2e0,127) AS real)
    

    这些是十进制值:

    SELECT
        max_float = 1.7976931348623158E+308
        , min_float = -1.7976931348623158E+308
        , max_real = 3.4028234E+38
        , min_real = -3.4028234E+38
    
        4
  •  2
  •   Kyle    9 年前
    1.79769313486231580799909999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    

    这是最大的 浮动 价值

    您可以通过以下方式获得:

    DECLARE @decimal_length int = 0
    DECLARE @decimal_value varchar(max) = '1.79'
    DECLARE @decimal_value_buffer varchar(max) = @decimal_value
    DECLARE @new_int varchar(10) = '9'
    DECLARE @dummy float
    WHILE @decimal_length < 308
    BEGIN
    
        SET @decimal_value = @decimal_value + @new_int
    
        BEGIN TRY
            SET @dummy =  CAST(@decimal_value + 'E+308' AS float)
            SET @decimal_length = @decimal_length + 1
            SET @decimal_value_buffer = @decimal_value
            SET @new_int = '9'
        END TRY
        BEGIN CATCH
            SET @decimal_value = @decimal_value_buffer
            SET @new_int = @new_int - 1
        END CATCH
    END
    
    PRINT @decimal_value