postgres日期验证正则表达式

时间:2015-12-30 11:26:29

标签: regex postgresql date

我在postgres中有一个大表,其中大部分日期都是DD-Mon-YY格式,但有些行不遵循这种模式,可以视为垃圾值。 当我尝试在此列上运行任何日期函数时,查询失败,并显示错误消息,指出此垃圾值不是有效的日期格式。

我的意图是通过编写case语句来跳过包含垃圾值的行。我只想处理那些遵循有效日期格式的行,即DD-Mon-YY'。

我已经为日期编写了以下正则表达式模式,当我在在线正则表达式测试器上测试但是没有在postgres上工作时,它正在工作。我是postgres的新手,所以请让我知道我在这里失踪了什么。

当我希望它返回True时,以下代码段返回False

SELECT '23-Dec-83' ~ '^\d{2}-[a-zA-Z]{3}-\d{2}$'

1 个答案:

答案 0 :(得分:1)

你的正则表达式正在返回true,但它并不好。

  1. 您应该尽量避免将日期存储为字符串/ varchar。这导致了一些问题。
  2. 尝试使用正确的数据类型。如果是约会,那就是约会。
  3. 然而,处理您案件的更好的正则表达式可能是:

    SELECT '30-Dec-83' ~ '^(([0-2][0-9])|([3][0-1]))-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d{2}$'
    

    <强> FIDDLE DEMO

    即使是像

    这样的格式,你的正则表达式也会返回True
    SELECT '23-Mon-83' ~ '^\d{2}-[a-zA-Z]{3}-\d{2}$'  //return True
    SELECT '23-Abc-83' ~ '^\d{2}-[a-zA-Z]{3}-\d{2}$'  //return True
    SELECT '23-Pqr-83' ~ '^\d{2}-[a-zA-Z]{3}-\d{2}$'  //return True
    

    这是理想的错误。