mysql字符串到日期转换

时间:2016-07-25 05:26:09

标签: mysql

需要帮助建议sql查询,其中我有一个名为Timing的varchar列,如下所示

+---------------------+
| Timing         | MO |
+---------------------+ 
|7/11/2016 20:45 |ABC |
|7/12/2016 20:45 |ABC |
|2016-07-11 00:00|ABC |
|2016-07-12 00:00|ABC |
+---------------------+

我需要从Timing列中提取日期,但棘手的部分是日期并不总是以相同的格式。我需要输出时序列,如下所示

+-------------+
| Timing  | MO|
+-------------+
|7/11/2016|ABC|
|7/12/2016|ABC|
|7/11/2016|ABC|
|7/12/2016|ABC|
+-------------+

1 个答案:

答案 0 :(得分:0)

使用substring和replace函数将varchar作为数据转换并将它们重新转换为所需的输出是很简单的。 例如

DROP TABLE T;
CREATE TABLE T (TIMING VARCHAR(20),MO VARCHAR(2));
INSERT INTO T VALUES
('7/11/2016 20:45' ,'AB'), 
('7/12/2016 20:45' ,'AB'),
('2016-07-11 00:00','AB'), 
('2016-07-12 00:00','AB'), 
('27/06/2016 20:45' ,'AB'), 
('29/05/2016 20:45' ,'AB')
*/

SELECT  *,
            CASE
                WHEN INSTR(TIMING,'/') = 0 THEN 
                    CASE WHEN INSTR(TIMING,'-') = 5 THEN  CAST(TIMING AS DATE)
                    end
                WHEN INSTR(TIMING,'/') = 3 THEN  
                    CAST(
                    CONCAT(
                    SUBSTRING(CONCAT('0',TIMING),8,4)
                    ,'-'
                    ,SUBSTRING(CONCAT('0',TIMING),5,2)
                    ,'-'
                    ,SUBSTRING(CONCAT('0',TIMING),1,2)
                    )
                    AS DATE
                    )
                WHEN INSTR(TIMING,'/') = 2 THEN  
                    CAST(
                    CONCAT(
                    SUBSTRING(CONCAT('0',TIMING),7,4)
                    ,'-'
                    ,SUBSTRING(CONCAT('0',TIMING),4,2)
                    ,'-'
                    ,SUBSTRING(CONCAT('0',TIMING),1,2)
                    )
                    AS DATE
                    )
            END 
FROM        T

结果

-----------------------------------------------------------------------------+
| 7/11/2016 20:45  | AB   | 2016-11-07                                                                                                                                                                                                                                                      |
| 7/12/2016 20:45  | AB   | 2016-12-07                                                                                                                                                                                                                                                      |
| 2016-07-11 00:00 | AB   | 2016-07-11                                                                                                                                                                                                                                                      |
| 2016-07-12 00:00 | AB   | 2016-07-12                                                                                                                                                                                                                                                      |
| 27/06/2016 20:45 | AB   | 2016-06-02                                                                                                                                                                                                                                                      |
| 29/05/2016 20:45 | AB   | 2016-05-02                                                                                                                                                                                                                                                      |
+------------------+------+-----------------------------------------------------

你必须为每个已知的变体编码 - 在这种情况下,我已经确定7/11/2016需要在日期转换之前用零填充并用斜线替换斜线。希望您的源代码中包含有限数量的日期变体,您最终会得到一个大型查询 - 但这就是生命。天哪,