【问题标题】:Extracting date range from a messy table从凌乱的表格中提取日期范围
【发布时间】:2022-01-17 22:45:42
【问题描述】:

我不知道该怎么做。我想在日志表中提取具有日期范围的行(即 2021-12-11 - 2021-12-14),但表行如下所示:

l_logs
l_ticket 12 null ae34a45fc-aafc-4dd2-e6f1-22c84csf51ee l_log_time 93 2021-12-11 18:36:00 2021-12-11 18:38:00

在这种情况下,BETWEEN、ANY 或 LIKE 不会有任何好处。也许是某种循环?

【问题讨论】:

  • 列的名称是什么?它们是什么数据类型?
  • 你是显示几列,还是显示一个文本列的内容?
  • 这是一列中只有一行的输出。所有内容都由您在此处看到的标签分隔。
  • 切向,但您确实应该投入时间和精力来解析这些数据并将其以更可行的格式插入数据库上游。这绝对可以在 SQL 中解析(在任何 ETL 的后端首先将这些数据放在表中),但如果您能够正确解析将数据预先转换为规范化的表结构。
  • @esqew 这是一个我无权更改的数据库。我只能从中选择东西。在这种情况下,我想从这个混乱中选择日期范围。

标签: sql postgresql


【解决方案1】:

查询的第一部分使用组提取全职行,然后 简单的 leftright 函数提取字符串的日期时间部分

select * from test_table;
                                                    l_logs
--------------------------------------------------------------------------------------------------------------
 l_ticket 12 null ae34a45fc-aafc-4dd2-e6f1-22c84csf51ee l_log_time 93 2021-12-11 18:36:00 2021-12-11 18:38:00
with s as (select 
          regexp_replace(l_logs,'.*l_log_time \d+ (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*','\1') full_time
          from test_table) 
select left(full_time,19)::timestamp start_t ,right(full_time,19)::timestamp end_t from s;

结果

       start_t       |        end_t
---------------------+---------------------
 2021-12-11 18:36:00 | 2021-12-11 18:38:00

【讨论】:

  • 有趣的想法,但是元素可以在不同的位置,所以不幸的是它不会工作。就像某些行中的日志时间可能在中间一样,它会有所不同......
  • 我改变了我的查询,现在它应该找到合适的时间
猜你喜欢
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 2022-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多