【问题标题】:String with date range bug impala带有日期范围错误的字符串 impala
【发布时间】:2022-12-20 20:30:51
【问题描述】:

我正在尝试获取一个日期范围为日期的字符串,例如“W202243 从 10 月 24 日到 10 月 30 日”,从每个星期一到星期日。为了实现这一点,我正在使用 impala,逐步创建字符串。 我的功能是: select distinct concat('W',substr(cast(a.day_key AS string),1,4), IF (DAYOFWEEK(from_unixtime(unix_timestamp(cast(cast(a.day_key AS string) AS string), "yyyyMMdd")))=2, cast(weekofyear(from_unixtime(unix_timestamp(cast(cast(a.day_key AS string) AS string), "yyyyMMdd")))-1 AS string), cast(weekofyear(from_unixtime(unix_timestamp(cast(cast(a.day_key AS string) AS string), "yyyyMMdd"))) AS string)), ' from ', SUBSTR(substr(cast(TRUNC(date_add(from_unixtime(unix_timestamp(cast(a.day_key AS string), "yyyyMMdd")),-1),'DY') AS string), 9,10),1,2), '-', SUBSTR(MONTHNAME(date_add(TRUNC(date_add(from_unixtime(unix_timestamp(cast(a.day_key AS string), "yyyyMMdd")),-1),'DY'),1)),1,3),' a ', SUBSTR(substr(cast(date_add(TRUNC(date_add(from_unixtime(unix_timestamp(cast(a.day_key AS string), "yyyyMMdd")),-1),'DY'),6) AS string), 9,10),1,2), '-', SUBSTR(MONTHNAME(date_add(TRUNC(date_add(from_unixtime(unix_timestamp(cast(a.day_key AS string), "yyyyMMdd")),-1),'DY'),6)),1,3))

结果几乎是正确的,除非一周的第一天也是一个月的最后一天,这给了我这个不需要的结果:(例如 W202244 从 11 月 31 日到 11 月 6 日 -> 11 月而不是 10 月)。 我可以在查询中添加什么来解决这个问题?

【问题讨论】:

    标签: sql impala truncate date-range


    【解决方案1】:

    虽然这读起来像简单的英语,但似乎特定的短语被用作“分隔符”。您可以使用 CHARINDEX 函数将此语句分解为 3 列,然后从那里将每列强制转换/转换为其最终形式。您可能可以在 1 个步骤中完成所有这一切,但是写入和读取会很混乱,我不确定它是否会提供任何性能优势

    您还可以使用 REPLACE 将此列转换为带分隔符的字符串,然后对其进行解析。例如:

    declare @string nvarchar(max) = 'W202243 from 24-Oct a 30-Oct'
    
    select REPLACE(REPLACE(@string, ' from ', ','),' a ', ',')
    

    这将返回:

    W202243,24-Oct,30-Oct
    

    这是逗号分隔的。您可以将分隔符更改为任何内容。但是从那里很容易得到 3 个不同的列并相应地转换它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 2017-09-25
      • 2016-10-27
      • 2016-12-10
      相关资源
      最近更新 更多