Snowflake中高效提取dateHour列完整星期名称的方案求助
从Timestamp字段高效提取完整星期名称的性能优化方案
需要基于星期维度构建聚合表,需从timestamp类型的dateHour列提取完整星期名称。目前尝试的两种方案均存在问题:
- 使用CASE WHEN结合DAYNAME函数的方案可正常运行,但CASE WHEN导致查询性能瓶颈;
- 使用TO_CHAR函数搭配'DYDY'参数时,单条数据查询能得到正确结果,但多条数据时会出现星期缩写重复的异常(如SunSun、SunMon)。
示例数据
| dateHour |
|---|
| 2021-08-01 18:00:00.000 |
| 2021-08-02 20:00:00.000 |
| 2021-08-03 06:00:00.000 |
| 2021-08-04 08:00:00.000 |
| 2021-08-05 09:00:00.000 |
尝试的CASE WHEN方案代码
select case dayname("dateHour"::date) when 'Mon' then 'Monday' when 'Tue' then 'Tuesday' when 'Wed' then 'Wednesday' when 'Thu' then 'Thursday' when 'Fri' then 'Friday' when 'Sat' then 'Saturday' when 'Sun' then 'Sunday' end as "day_of_week" from tableName
TO_CHAR方案的问题复现
单条数据查询(结果正常)
select TO_CHAR(CURRENT_DATE, 'DYDY') Day_Full_Name;
多条数据查询(出现重复异常)
with cte as ( select '2021-08-01 18:00:00.000'::timestamp as "dateHour" union all select '2021-08-02 20:00:00.000'::timestamp as "dateHour" ) select "dateHour"::date as dt, TO_CHAR(dt,'DYDY') day_full_name from cte ;
期望输出
| fullDayofWeekName |
|---|
| SUNDAY |
| MONDAY |
| TUESDAY |
| WEDNESDAY |
| THURSDAY |
高效解决方案
针对PostgreSQL及兼容SQL标准的数据库
直接使用TO_CHAR函数搭配'FMDay'格式参数,无需分支判断,性能更优且无重复异常:
select UPPER(TO_CHAR("dateHour"::date, 'FMDay')) as fullDayofWeekName from tableName;
FMDay:FM用于去除星期名称末尾的填充空格(默认TO_CHAR返回的星期名称会补空格到固定长度),Day指定返回完整星期名称;UPPER():将结果转为大写,匹配期望输出格式。
针对MySQL数据库
直接使用DAYNAME()函数获取完整星期名称,再转为大写即可:
select UPPER(DAYNAME("dateHour")) as fullDayofWeekName from tableName;
内容的提问来源于stack exchange,提问作者Teja Goud Kandula
相关产品推荐
相关产品推荐

