【问题标题】:Extract date from String column in sql从sql中的String列中提取日期
【发布时间】:2018-06-01 20:32:36
【问题描述】:

我有一个列为 current_data,它的数据类型为 string,数据为 {"settlement_date":"2018-07-21"}。 我的问题是,每笔交易的结算日期都会不同,我想从每笔交易的 current_data 列中提取日期,即 2018-07-21。我尝试使用 select to_char(date_trunc(d.current_data,'YYYY-MM-DD')) 作为“Current_date”,我也尝试过修剪功能,但它不起作用

【问题讨论】:

  • 您使用的是哪个 DBMS?这对我来说似乎是 JSON 格式。您确定它在内部存储为字符串(文本)吗?

标签: sql string date


【解决方案1】:

看起来像JSON 数据。由于您在内部说它是一个文本列,因此您可以使用 substring 函数仅剪切您要查找的数据。

select substring(current_data from 21 for 10) from yourtable

您从 21 个字符开始获取子字符串,并指定它的长度将是接下来的 10 个字符。

使用您的示例数据,结果将是

db=# select substring('{"settlement_date":"2018-07-21"}' from 21 for 10);
 substring
------------
 2018-07-21

请注意,此解决方案依赖于字符串的长度,并且专为静态输入而设计,其中提取的子字符串始终位于同一位置。

【讨论】:

  • 我试过得到错误@Kamil G。函数 date_trunc(unknown, varchar) 不存在,或者 date_trunc(unknown, varchar) 的权限被拒绝
  • 我的回答中没有 date_trunc 函数。您确定您尝试了我的解决方案而不是您的解决方案吗?
  • @TAJINDERSINGH 我不清楚。使用所有相关信息更新您的答案,以便人们提供帮助。
  • 当我运行查询时:select d.current_data , (select substring('current_data' from 21 for 10)) as modified_data from DAILY_AMENDED_TRADE_REPORT d INNER JOIN TRADE_REPORT t ON d.trade_id=t.trade_id and d .source_system=t.source_system where business_date='2018-06-01' 我得到的答案是 current_data:{"settlement_date":"2018-06-20"} 并且 modified_data 为空 modified_data
  • @TAJINDERSINGH 您需要删除 current_data 周围的撇号。这是一个列引用,所以它不应该是一个字符串。在开始时将您的查询改写为:select d.current_data, substring(d.current_data from 21 for 10) as modified_data from ... 您也不需要在其中进行另一个选择(我删除了它)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多