如何检查单元格是否包含日期格式的数据(oracle)

时间:2015-05-20 14:39:00

标签: sql oracle

我需要验证列中的所有单元格是否只包含日期格式的数据。如何验证? *我认为这不是功能。

3 个答案:

答案 0 :(得分:1)

根据your last question,我认为您正在寻找类似的内容:

SELECT COUNT(*) FROM ...
WHERE NOT REGEXP_LIKE (A, '^XXX/MOSCOW/XXXMSX/[0-9]{4}-[0-9]{2}-[0-9]{2}$') 

如果count大于零,则某些内容不匹配。如果您想了解不匹配的详细信息,请相应更改SELECT条款。

如果您要查找多种日期格式,可以适当更改正则表达式。大多数正则表达式中的|运算符(包括Oracle)允许您在同一空间中定义多个模式。您可能会使用类似

的内容
SELECT COUNT(*) FROM ...
WHERE NOT
REGEXP_LIKE (A,
  '^XXX/MOSCOW/XXXMSX/[0-9]{4}-[0-9]{2}-[0-9]{2}$|^[0-9]{4}-[0-9]{2}-[0-9]{2}$')

根据需要添加尽可能多的匹配模式。

答案 1 :(得分:1)

DATE 没有任何格式。你看到的是显示目的,以便它可以很容易地解释。

DATE数据类型7 bytes内部专有格式存储。这是一个坏主意,在日期以内部格式存储时验证格式是没有意义的。正如我所说, display 的格式仅为

如果日期列不是 DATE数据类型,那么它是设计缺陷。而且,基于这种有缺陷的数据库设计的任何应用程序都可以随时打破。

存储日期数据类型以外的DATE值就像不了解基础知识一样。

您应首先修复设计以获得永久性解决方案。您的问题的任何解决方案只是另一种解决方法。

让我举一个小例子来说明它是如何造成更多混乱的。

以下日期:

01/02/2015

是吗:

  1. 1st Feb 2015或,
  2. 2nd Jan 2015
  3. 没有办法说出来。它可以是 DD MM 。由于数据类型不正确,这只是众多其他问题中的一个。

      

    仅将日期值存储为DATE数据类型,句点。

答案 2 :(得分:0)

尝试

SELECT *
  FROM POL
  WHERE NOT REGEXP_LIKE(TR_KRY, '^(0[1-9]|([1-2][0-9])|30|31)-(([0][1-9])|10|11|12)-[0-9]{4}$')

这将返回TR_KRY未格式化为'DD-MM-YYYY'的所有行,其中DD为'01' - '31',MM为'01' - '12',YYYY为任意四个数字位数。

正如其他人所说,将日期存储为字符串并不是一个好主意。在您正在查看的字段中,可能是日期存储为DD-MM-YYYY(日 - 月 - 年 - 欧洲和其他地方的常见情况),或者可能是日期存储为MM-DD-YYYY(月 - 日 - 美国的常见做法)。如果可能,我建议您将此字段转换为DATE数据类型,以便TO_CHAR函数可用于生成所需格式的日期的文本版本。

鉴于您在评论中显示的示例数据(这也不是一个好习惯 - 您应该在需要包含其他信息时返回并编辑问题),日期显示为DD-MM-YYYY和我已经设置了上面的正则表达式来尽可能地处理这个问题。