You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL从文本列提取DateTime的方法、正则及格式识别

解决PostgreSQL中提取两种格式时间戳的问题

1. 提取DateTime的方法及正则表达式

首先用正则定位文本中第一行的时间部分——两种格式的时间都位于邮箱后的-分隔符之后,直到该行末尾。

正则表达式

用正向预查匹配分隔符后的内容:

(?<=- ).+$

在PostgreSQL中,通过以下方式提取时间字符串:

-- 提取为数组,取第一个元素得到纯时间文本
SELECT (regexp_match(comment_column, '(?<=- ).+$'))[1] AS time_str FROM your_table;

转换为Timestamp类型

提取到时间字符串后,用to_timestamp结合coalesce兼容两种格式:

SELECT 
  coalesce(
    -- 处理带时分秒的格式
    to_timestamp((regexp_match(comment_column, '(?<=- ).+$'))[1], 'MM/DD/YYYY HH24:MI:SS'),
    -- 处理仅日期的格式,转换后时分秒默认补0
    to_timestamp((regexp_match(comment_column, '(?<=- ).+$'))[1], 'DD-Mon-YYYY')
  ) AS extracted_timestamp
FROM your_table;

2. 识别第二种格式的月份数字与日期格式

第二种格式为DD-Mon-YYYY(如12-Aug-2022),其中Mon是3位英文月份缩写(PostgreSQL默认支持英文缩写,若数据库语言非英文需调整lc_time参数)。

转换与提取月份数字

  • 直接转换为timestamp后提取月份:
SELECT 
  extract(month FROM to_timestamp((regexp_match(comment_column, '(?<=- ).+$'))[1], 'DD-Mon-YYYY')) AS month_num
FROM your_table
-- 先筛选出第二种格式的行
WHERE comment_column ~ '\d{2}-[A-Za-z]{3}-\d{4}';
  • 或用正则提取月份缩写后映射为数字:
SELECT 
  CASE (regexp_match(comment_column, '(?<=- \d{2}-)[A-Za-z]{3}(?=-\d{4})'))[1]
    WHEN 'Jan' THEN 1 WHEN 'Feb' THEN 2 WHEN 'Mar' THEN 3
    WHEN 'Apr' THEN 4 WHEN 'May' THEN 5 WHEN 'Jun' THEN 6
    WHEN 'Jul' THEN 7 WHEN 'Aug' THEN 8 WHEN 'Sep' THEN 9
    WHEN 'Oct' THEN 10 WHEN 'Nov' THEN 11 WHEN 'Dec' THEN 12
  END AS month_num
FROM your_table
WHERE comment_column ~ '\d{2}-[A-Za-z]{3}-\d{4}';

内容的提问来源于stack exchange,提问作者Suraj221b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:25:27