是否有一个 SQL 函数可以根据特定列的转换子字符串的计算从数据库中选择样本?

Posted

技术标签:

【中文标题】是否有一个 SQL 函数可以根据特定列的转换子字符串的计算从数据库中选择样本?【英文标题】:Is there an SQL function to select sample from a database based on calculation of converted substrings of a specific column? 【发布时间】:2022-01-08 00:23:05 【问题描述】:

我有一个大表,我正试图过滤掉它,但是我拥有的数据很脏。

我需要找到剩余时间少于一定时间的合同,但是只有一列包含合同的时间。我们将此列称为“术语”Term内的数据大致如下:

*x* years from *dd mmmm yyyy*

例如,对于从 2020 年 12 月 12 日开始的 30 年合同,该行在 Term 列中的条目如下所示:

30 years from 12 December 2020

任务是找到剩余少于 x 年的合同。正如您可能从我在这个问题中使用的语言中看出的那样,我有点菜鸟,所以请放轻松。我尝试了以下 (对于这个例子,假设我正在寻找剩余不到 10 年的合同,但其中一些合同可能超过 100 年)

SELECT * FROM mydb WHERE
(CAST(LEFT(`Term`,POSITION(" " IN `Term`)) AS DECIMAL(4,0))) + (CAST(RIGHT(`Term`,4) AS DECIMAL(4,0))) - year(curdate()) < 10

但显然它不起作用,我不知道为什么

非常感谢您的帮助!

【问题讨论】:

确定您使用的是 SQL Server 吗?您使用反引号 (`) 在 SQL 中分隔标识您的对象;这不是 T-SQL 中的有效分隔标识符。 tsql 也没有 POSITION 和 CURDATE 函数。好像你正在使用 mysql 【参考方案1】:

这适用于 MySql 8 和 MariaDB 10

SELECT *
FROM 
(
    SELECT *
    , CAST(REGEXP_SUBSTR(Term, '([0-9]+)(?= year[s]?)') AS UNSIGNED) as term_years
    , STR_TO_DATE(REGEXP_SUBSTR(Term, '[0-9]1,2 [A-Za-z]3, [0-9]4'), '%d %M %Y') as term_start_date
    FROM mydb
) q
WHERE (YEAR(term_start_date) + term_years) < (YEAR(CurDate()) + 10) 
id Term term_years term_start_date
2 9 year from 16 April 2021 9 2021-04-16

dbfiddle here

上的演示

【讨论】:

以上是关于是否有一个 SQL 函数可以根据特定列的转换子字符串的计算从数据库中选择样本?的主要内容,如果未能解决你的问题,请参考以下文章

sql怎么把字符串转换为数字?

在sql中如何将字符串数字转换成数字?

sql语句中怎样将字符类型转换成数字类型

根据值是不是是另一列的子字符串来更新列值

是否有根据日期转换为 PST 或 PDT 的 SQL 函数?

sql如何根据隔符分割字符串?