标题中特定日期的REGEX

时间:2015-10-27 06:04:27

标签: mysql regex

我在表格中有很多帖子都有日期标题字符串,例如" 1990年1月1日"或" 31.12.2000"。

我正在寻找一种正则表达式来创建一个给我的mysql查询

a)某些年份(例如1960年至1990年)之间的职位

b)确切日期(例如1.1.1960 - 1990年12月31日)之间的帖子

我以某种方式尝试过这样:

SELECT ID FROM posts WHERE post_title LIKE '%.1960'

(这给了我在post_title中有" 1960"的所有帖子,所以我可以为所有其他年份做一个循环并将结果一起添加)

但是我觉得用正则表达式以某种方式更容易实现, e.g。

SELECT * FROM posts WHERE post_title REGEXP '^(\d+)\.(\d+)\.(\d+)$'

...例如,最后一位数字可以是日期范围(1960 - 1990)。

有可能吗?

3 个答案:

答案 0 :(得分:2)

你应该使用string_to_date()这样你就可以将你的日期解析为mysql中的实际日期,这样你就可以使用所有内置函数,比如YEAR和BETWEEN

SELECT ID 
FROM posts
WHERE YEAR(string_to_date(post_title, '%m.%d.%Y')) > 1959 AND YEAR(string_to_date(post_title, '%m.%d.%Y')) < 1991

和范围

SELECT ID 
FROM posts
WHERE string_to_date(post_title, '%m.%d.%Y') BETWEEN '1960-01-01' AND '1990-12-31'

答案 1 :(得分:1)

  1. 1962年至1995年之间的日期

    '\d\d?\.\d\d?\.19(6[2-9]|[7-8][0-9]|9[0-5])'

  2. 确切日期1.2.1962和10.8.1995之间的日期

    '(([1-9]|[1-2][0-9])\.([1-9]|1[1-2])1962|\d\d?\.\d\d?\.19(6[3-9]|[7-8][0-9]|9[0-4])|([1-9]|10)\.[1-8]\.1995'

  3. 我希望你看到正则表达式不是解决问题的好方法。你肯定找不到一个简单的解决方案,因为我们从所有的编程语言中看到,使用日期并非易事。

    考虑到所有需要的正则表达式内容已经封装在STR_TO_DATE函数中(我相信,它比你在这里的答案中找到的任何解决方案都要测试得更好)并且没有必要自己解开。因此,您需要从标题字符串中删除日期,将它们转换为日期类型并与边界日期进行比较。

答案 2 :(得分:-1)

我认为子字符串函数很容易提取日期,然后使用日期比较与实际日期进行比较。

您可以通过从标题中提取日期来在表格中添加单独的列。或比较运行状况。

1)如果你添加date_title,那么

更新帖子   set date_title = STR_TO_DATE(            CONCAT(SUBSTRING_INDEX(post_title,'。', - 1),            ' - ',            SUBSTRING(POST_TITLE,找到( '',POST_TITLE)+1,2)            ' - ',            SUBSTRING(POST_TITLE,1,找到( '',POST_TITLE)-1)),           '%Y-%m-%d');

2)或在条件适用的地方使用。

从帖子中选择* STR_TO_DATE(CONCAT(SUBSTRING_INDEX(post_title,'。', - 1),' - ',SUBSTRING(post_title,locate('。',post_title)+1,2),' - ', SUBSTRING(POST_TITLE,1,找到(”。 'POST_TITLE)-1)),' %Y-%间 - %d ')=' 2015年10月1' 日