sql - 为什么我在使用日期操作时不能在别名中使用列名
问题描述
目前我正在使用 HIVE_SQL 将数据库从 SQL_SERVER 迁移到 SPARK。
当我尝试将数字传递给日期格式时遇到问题。我发现答案是:
from_unixtime(unix_timestamp(cast(DATE as string) , 'dd-MM-yyyy'))
当我执行这个查询时,它会给我带来数据,请注意我放置了一个不同于 FECHA 列名称的别名:
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(CAST(FECHA AS STRING ) ,'yyyyMMdd'), 'yyyy-MM-dd') AS FECHA_1
FROM reportes_hechos_avisos_diarios
LIMIT 1
| FECHA_1 |
| -------- |
| 2019-01-01 |
但是当我使用与列名相同的别名时,它会给我带来一个不一致的信息:
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(CAST(FECHA AS STRING ) ,'yyyyMMdd'), 'yyyy-MM-dd') AS FECHA
FROM reportes_hechos_avisos_diarios
LIMIT 1
| FECHA |
| -------- |
| 2.019 |
我知道简单的答案是,放置一个与列名不同的别名,但是我在 Tableau 中有一个从这个查询提供的实现,并且更改这些列很复杂,因为基本上我必须更改所有实现,所以我需要保留列名。此查询在 SQL SERVER 中适用于我,但我不知道为什么在配置单元中不起作用。 问题 预期结果
PSDT:感谢您的关注,这是我在堆栈中提出的第一个问题,我的母语不是英语,如果我有语法错误,请见谅。
解决方案
limit 1
没有order by
可能会在运行之间产生不确定的结果,因为行的顺序由于并行执行是随机的,某些因素可能会以某种方式影响它,但不能保证获得相同的行。
发生了什么 - 我猜您收到不同的行并且该行中的日期已损坏,这就是返回一些奇怪结果的原因。
此外,您可以使用另一种转换方法:
select date(regexp_replace(cast(20200101 as string),'(\\d{4})(\\d{2})(\\d{2})','$1-$2-$3')) --put your column instead of constant.
结果:
2020-01-01
推荐阅读
- javascript - 如何在没有控制台错误的情况下显示网站错误?
- winapi - 返回 0 的函数有效,返回 > 0 将使程序崩溃
- angular - 在 Angular 8 中删除/降低按下/mousedown/touchstart 延迟?
- android - 搜索栏和媒体播放器安卓
- vsto - VSTO:防止特定的 AppointmentItems 被转换为经常性 AppointmentItems
- outlook - 如何在不存储在 webmail 收件箱中的情况下直接获取电子邮件?
- java - Java Web 服务请求参数返回为 null
- angular - 加载ctrl微调器启动时禁用硬件后退按钮?
- javascript - 如何在我的 vue 模板脚本中有条件地调用 apollo 客户端?
- shell - 将 CSV 转换为列分隔值,但将值放在最右边