【问题标题】:MySQL function returns different ouput than its codeMySQL 函数返回与其代码不同的输出
【发布时间】:2018-08-10 13:10:43
【问题描述】:

我创建了一个返回 date 对象的函数。

    CREATE
        FUNCTION FLOAT2DATE(
            value float
        ) RETURNS DATE RETURN str_to_date(
                cast(
                    value as char
                ),
                '%Y%m%d'
            );

当我运行代码时,一切都按预期运行。
但是当我运行该函数的代码时,它没有按预期工作,它返回一个错误的值。

    SET @VALUE = 20160101;
    select FLOAT2DATE(@VALUE) as func, null as code
    union 
    select null as func , str_to_date(
                cast(
                    @VALUE as char
                ),
                '%Y%m%d'
            ) as code;

func       |code       |
-----------|-----------|
2015-12-31 |           |
           |2016-01-01 |

MySQL 版本

select @@version

@@version  |
-----------|
5.7.19-log |

任何想法出了什么问题?

【问题讨论】:

  • 将@value声明为float然后检查
  • 浮点数据类型是近似值 dev.mysql.com/doc/refman/5.7/en/floating-point-types.html 使用 int 代替。
  • 我看不出你为什么要使用浮点数或任何带小数点的东西。但如果你这样做,请使用decimal/numeric,这样表示是准确的。
  • @GordonLinoff 我使用浮点数,因为现有数据类型列是浮点数。这不是我决定的。
  • @Markus 。 . .好吧,您正在学习为什么这是一个坏主意。我想不出将日期/时间值存储为浮点数而不是使用本机数据库类型的充分理由——除非目的是故意混淆系统。

标签: mysql sql function stored-procedures


【解决方案1】:

就像在 cmets 中提到的那样,使用 INT 可以工作

CREATE
    FUNCTION FLOAT2DATE(
        value INT UNSIGNED
    ) RETURNS DATE RETURN str_to_date(
            cast(
                cast(
                    value as UNSIGNED
                )as char
            ),
            '%Y%m%d'
        );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 2015-07-21
    • 1970-01-01
    • 2018-01-29
    • 2019-10-12
    相关资源
    最近更新 更多