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

Axa*_*dax 19 sql t-sql sql-server floating-point

是否有一种以编程方式(在T-SQL中)检索数据类型的最大(和最小)值的方法?它在C#中的行为类似于float.MaxValue.

当参数不等于数据库中的任何实际值时,我想在某些选择中使用它,所以我会使用类似的东西

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*/)
Run Code Online (Sandbox Code Playgroud)

Sql*_*yan 22

虽然似乎没有任何内联方式来获取最小值或最大值,但是有人将它组合在一起:

 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 
Run Code Online (Sandbox Code Playgroud)

之后,您可以将最大值复制到本地变量,或者(使用查询时)将此表交叉连接.

  Declare @max_int int 
  Set @max_int=(SELECT max_int FROM datatype_extrema) 
  IF COALESCE(@FirstInt, @max_int) < COALESCE(@SecondInt, 0) 
Run Code Online (Sandbox Code Playgroud)


Oli*_*ver 12

以下是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
Run Code Online (Sandbox Code Playgroud)

不幸的是,它不可能从varbinary转换它们,但varchar工作没有任何问题.


Ant*_*ull 5

对于floatreal最小最大值可以使用计算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)
Run Code Online (Sandbox Code Playgroud)

这些是十进制值:

SELECT
    max_float = 1.7976931348623158E+308
    , min_float = -1.7976931348623158E+308
    , max_real = 3.4028234E+38
    , min_real = -3.4028234E+38
Run Code Online (Sandbox Code Playgroud)


Kyl*_*yle 5

1.79769313486231580799909999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
Run Code Online (Sandbox Code Playgroud)

这是浮点值的最大数量

获取方法如下:

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
Run Code Online (Sandbox Code Playgroud)