【问题标题】:How to check TIMESTAMP format in SQL?如何在 SQL 中检查 TIMESTAMP 格式?
【发布时间】:2022-01-20 11:41:51
【问题描述】:

检查带有类似于 TIMESTAMP_NTZ 值的 JSON 的 VARIANT TYPE 是否具有正确格式的最佳方法是什么?

例如,这是我想要的正确格式

 2020-12-26T12:12:11.215581Z

但有时它在数据库中看起来不同,像这样

2021-11-26T12:12:11.215581Z[UTC]

我想检测与参考格式不同的记录。

我尝试使用简单的 LIKE,但它忽略了可能与此不同的格式。

LIKE '%[UTC]%'

【问题讨论】:

  • 您使用的是哪个 dbms? (说到日期/时间,许多产品都有自己的非 ANSI 函数。)
  • 列数据类型?
  • 好吧,那么它不是“时间戳”列,而是包含应该是时间戳的内容的字符串/文本列。如果你选择了合适的数据类型,你一开始就不会有这个问题。
  • 请标记 rdbms。需要正则表达式。
  • 标签是一个general 标签,但这里我们需要您正在使用的特定dbms 产品的标签。 (不同的产品有不同的功能。)

标签: sql timestamp rdbms


【解决方案1】:

您可以使用正则表达式来检查所需格式的相等性。如果 rdbms 已知,我将扩展此答案。

[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{6}Z

MySQL 和 SQLite

SELECT * FROM table 
WHERE timestamp not REGEXP '[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{6}Z';

甲骨文

SELECT * FROM table 
WHERE not REGEXP_LIKE(timestamp, '[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{6}Z');

【讨论】:

  • 当然它无法捕捉到像“2022-02-29T...”这样的日期
  • 请您澄清一下,为什么这会在闰日失败?
  • 它通过了正则表达式,但当有人实际尝试将其转换为日期时间时它会失败(或做一些意想不到的事情)(例如,这个 select cast('2022-02-29T12:12:11.215581Z' as datetimeoffset) 在 SQL 服务器上会失败)。
  • 我从问题评论部分得出该列的类型为字符串/文本。因此无需注意某些日期的繁琐处理。 Op 询问如何确定不同的格式,而不是如何转换这些字符串。
【解决方案2】:

如果您想要检测的所有记录都出现在格式末尾之外,那么您可以使用长度。

基本上:

WHERE NOT len(column_name)=27

27,因为您的正确格式 2020-12-26T12:12:11.215581Z 有 27 个字符。

【讨论】:

  • Thanks 是一个解决方案,但如果我们假设它可以有更少的数字,最好检查它是否以 'Z' 结尾
  • 你是对的。您也可以检查结束字母。祝你好运。
猜你喜欢
  • 2020-06-12
  • 2021-09-21
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多