我在一个项目上有一个糟糕的数据库,他们使用了一个文本字段作为日期。
所以,我需要构建一个在一列中只有年份的视图。问题是我有任何标准格式的日期,例如:
- 01-01-2012
- 01.01.2012
- 01 01 2012
- 2012 年 1 月 1 日
- 01/2012
- 1/2012
- 2012
- 01.2012
有什么方法可以构建一个 SQL (MySQL) 来仅获取这 4 年的数字来构建一个视图?
非常感谢你的帮助!
这真的取决于整个数据结构,您可以使用 REGEX 或String 函数。
例如,对于您的示例数据,右侧的最后 4 位数字是年份,因此使用
SELECT RIGHT(fieldname, 4) FROM table
会工作。如果该模式不起作用,那么您必须使用 concat 并开始拆分它们或编写 REGEX 语句。
如果 RIGHT 可以工作,那么您可以执行 INSERT SELECT
INSERT INTO table (yearcolumn)
SELECT RIGHT(fieldname, 4) FROM table
这也可能有所帮助。这是整个当年的 Oracle 查询。它可以很容易地转换为任何 SQL。它使用递归查询来构建年表。用您的 SQL 格式和系统日期版本替换 SYSDATE 和 Oracle 格式:
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