开发者社区> 问答> 正文

OceanBase数据库这个sql语句单独执行结果是对的 union all以后结果就变了 是啥情况

select (UNIX_TIMESTAMP(cast(DATE_ADD(NOW(), interval -1 day) as DATE))) as time
union all
select (UNIX_TIMESTAMP(cast(DATE_ADD(NOW(), interval -1 day) as DATE))) as time
OceanBase数据库这个sql语句单独执行每条结果时间是对的 union all以后结果就变了 是啥情况?
e4533da16b81017ac4a5bd1f7d9d3310.png
81ae491753ec42f2c17d6027aeeb8d9a.png

展开
收起
2401。 2023-10-05 21:30:52 199 0
来自:OceanBase
2 条回答
写回答
取消 提交回答
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    在OceanBase数据库中,执行上述SQL语句可能导致结果出现变化的一个可能原因是,在执行UNION ALL操作时,两个子查询返回的数据类型不匹配。

    根据您提供的SQL语句,两个子查询都使用了UNIX_TIMESTAMP函数来将日期转换为时间戳。然而,由于表达式"(UNIX_TIMESTAMP(cast(DATE_ADD(NOW(), interval -1 day) as DATE)))"返回的结果是整数类型(时间戳),而非日期类型。

    当进行UNION ALL操作时,要求两个子查询返回的列具有相同的数据类型。但由于您的子查询返回的是整数类型(时间戳),可能与其他查询结果(日期或字符串类型)进行合并时产生冲突,从而导致结果出现变化。

    为了解决此问题,您可以尝试将子查询返回的时间戳结果转换为日期类型,以保持数据类型的一致性。例如,可以使用FROM_UNIXTIME函数将时间戳转换回日期格式,如下所示:

    SELECT FROM_UNIXTIME((UNIX_TIMESTAMP(cast(DATE_ADD(NOW(), interval -1 day) as DATE)))) as time
    UNION ALL
    SELECT FROM_UNIXTIME((UNIX_TIMESTAMP(cast(DATE_ADD(NOW(), interval -1 day) as DATE)))) as time
    
    2023-10-08 22:09:18
    赞同 展开评论 打赏
  • union all 是直接对两个查询结果集进行合并输出。可以参考下官方文档
    https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000033580
    此回答整理自钉群“[社区]技术答疑群OceanBase”。

    2023-10-06 13:59:06
    赞同 展开评论 打赏
来源圈子
更多
收录在圈子:
+ 订阅
蚂蚁OceanBase数据库团队,用于OceanBase技术原理、运维经验和案例分享、对外交流。
问答排行榜
最热
最新

相关电子书

更多
DTCC 2022大会集锦《云原生一站式数据库技术与实践》 立即下载
阿里云瑶池数据库精要2022版 立即下载
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载