4

我在一个项目上有一个糟糕的数据库,他们使用了一个文本字段作为日期。

所以,我需要构建一个在一列中只有年份的视图。问题是我有任何标准格式的日期,例如:

  • 01-01-2012
  • 01.01.2012
  • 01 01 2012
  • 2012 年 1 月 1 日
  • 01/2012
  • 1/2012
  • 2012
  • 01.2012

有什么方法可以构建一个 SQL (MySQL) 来仅获取这 4 年的数字来构建一个视图?

非常感谢你的帮助!

4

3 回答 3

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
于 2013-03-08T13:36:14.947 回答
1

您可以使用REGEXP匹配来获取给定年份的行。不过,没有办法从正则表达式中获取捕获。但是,如果年份部分总是最后 4 位数字,请使用RIGHT(). 否则,您将需要重新格式化客户端。

于 2013-03-08T13:33:41.570 回答
0

这也可能有所帮助。这是整个当年的 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
于 2013-03-08T15:19:16.223 回答