MySQL STR_TO_DATE用于仅包含月份和年份或仅年份的字符串

时间:2016-10-21 16:18:04

标签: mysql string date type-conversion str-to-date

我有一个名为ReleaseDate的列(它是一个字符串)。其中大多数都是%e %M %Y(1979年5月25日)的形式,但有一些地方只有%M %Y(1979年5月)或%Y(1979年)。不幸的是,STR_TO_DATE似乎不适用于%M %Y。这是我尝试过的:

SELECT ReleaseDate,
       CASE
         WHEN STR_TO_DATE(ReleaseDate, '%e %M %Y') IS NULL
         THEN CASE
                WHEN STR_TO_DATE(ReleaseDate, '%M %Y') IS NULL
                THEN STR_TO_DATE(ReleaseDate, 'Y')
                ELSE STR_TO_DATE(ReleaseDate, '%M %Y')
              END
         ELSE STR_TO_DATE(ReleaseDate, '%e %M %Y')
       END,
       STR_TO_DATE(ReleaseDate, '%M %Y')
FROM   MyTable

但它返回以下内容:

 RealeaseDate           CASE           STR_TO_DATE
 -------------------------------------------------
| 20 May 2003 | 5/20/2003 12:00:00 AM |  {null}   |
| 16 May 2000 | 5/16/2000 12:00:00 AM |  {null}   |
| May 1976    |        {null}         |  {null}   |
 -------------------------------------------------

有没有解决方法呢?

修改

要添加此功能,我尝试通过取出sql_mode甚至添加STRICT_TRANS_TABLES来更改ALLOW_INVALID_DATES,但这也无效。根据{{​​3}},我无法使用以下示例:

SELECT STR_TO_DATE('9','%m');

也返回{null}

我也尝试将sql_mode设为空白。通过运行:

SELECT version();
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session

我明白了:

 version() *
-------------
| 5.6.14    |
-------------

 global session
----------------
|      |       |
----------------

1 个答案:

答案 0 :(得分:-1)

尝试CONVERT(DATE, GETDATE()) OR CONVERT(VARCHAR, GETDATE(), 22)