我需要验证列中的所有单元格是否只包含日期格式的数据。如何验证? *我认为这不是功能。
答案 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
是吗:
1st Feb 2015
或,2nd Jan 2015
没有办法说出来。它可以是 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和我已经设置了上面的正则表达式来尽可能地处理这个问题。