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