Mysql SQL 用于“替换除此之外的所有内容”其中 xxx
Posted
技术标签:
【中文标题】Mysql SQL 用于“替换除此之外的所有内容”其中 xxx【英文标题】:Mysql SQL for "replace everything but this" where xxx 【发布时间】:2013-03-08 13:28:40 【问题描述】:我的项目数据库很糟糕,他们使用文本字段作为日期。
因此,我需要构建一个在一列中只有年份的视图。问题是我有任何标准格式的日期,例如:
01-01-2012 01.01.2012 01 01 2012 2012 年 1 月 1 日 01/2012 1/2012 2012 01.2012有什么方法可以构建 SQL (mysql) 以仅获取这 4 年的数字来构建视图?
非常感谢您的帮助!
【问题讨论】:
哇,我敢打赌这个项目还有其他一些不错的“惊喜”在等着你。 令人惊讶的是,他们并没有将所有列都放入一个巨大的逗号分隔字符串中并将其存储在一个列中 【参考方案1】:这真的取决于整个数据结构,你可以使用 REGEX 或String functions。
例如,对于您的示例数据,右侧的最后 4 位数字是年份,因此使用
SELECT RIGHT(fieldname, 4) FROM table
会起作用的。如果该模式不起作用,那么您必须使用 concat 并开始拆分它们或编写 REGEX 语句。
如果 RIGHT 可以工作,那么您可以执行 INSERT SELECT
INSERT INTO table (yearcolumn)
SELECT RIGHT(fieldname, 4) FROM table
【讨论】:
【参考方案2】:您可以使用REGEXP
匹配来获取给定年份的行。不过,没有办法从正则表达式中获取捕获。
但是,如果年份部分总是最后 4 位,请使用 RIGHT()
。否则,您将需要重新格式化客户端。
【讨论】:
谢谢,我已经能够使用正则表达式毫无问题地进行搜索,但我需要实际年份来进行排序和分组。也许 RIGHT() 会起作用,让我试试! RIGHT() 可以解决问题,至少他们将年份放在每一行的末尾;)【参考方案3】:这也可能有所帮助。这是整个当年的 Oracle 查询。它可以很容易地转换为任何 SQL。它使用递归查询来构建年表。将 SYSDATE 和 Oracle 格式替换为您的 SQL 格式版本和系统日期:
WITH data(r, start_date) AS
(
SELECT 1 r, TRUNC(SYSDATE, 'YEAR') start_date FROM dual -- start_date: 1/1/2013
UNION ALL
SELECT r+1, TRUNC(SYSDATE, 'YEAR')+r-1 FROM data WHERE r < 365 -- any number: end_date - start_date or get the number of days in your year your way...
)
SELECT start_date
, TO_CHAR(start_date, 'YYYY') curr_year
, TRUNC(start_date, 'IW') wk_starts
, TRUNC(start_date, 'IW') + 7 - 1/86400 wk_ends
, TO_NUMBER (TO_CHAR (start_date, 'IW')) ISO_wk#
FROM data
/
START_DATE CURR_YEAR WK_STARTS WK_ENDS ISO_WK#
-----------------------------------------------------------------------
1/1/2013 2013 12/31/2012 1/6/2013 11:59:59 PM 1
1/1/2013 2013 12/31/2012 1/6/2013 11:59:59 PM 1
...
12/28/2013 2013 12/23/2013 12/29/2013 11:59:59 PM 52
12/29/2013 2013 12/23/2013 12/29/2013 11:59:59 PM 52
12/30/2013 2013 12/30/2013 1/5/2014 11:59:59 PM 1
【讨论】:
以上是关于Mysql SQL 用于“替换除此之外的所有内容”其中 xxx的主要内容,如果未能解决你的问题,请参考以下文章
sql 脚本适用于 MySQL,但不适用于 google bigquery