更改列中数据的格式

时间:2014-04-17 17:09:18

标签: sql sql-server

尝试将日期列从YYYYMMDD更改为MMDDYYYY,同时保持varchar值。目前我的列设置为varchar(10)。有没有办法改变质量数字的字符串,因为我有数千行需要转换格式。

例如:

|   ID    |    Date    |
------------------------
|    1    | 20140911   |
|    2    | 20140101   |
|    3    | 20140829   |

我希望我的桌子看起来像:

|   ID    |    Date    |
------------------------
|    1    | 09112014   |
|    2    | 01012014   |
|    3    | 08292014   |

额外问题:如果有针对09/12/12的91212或者应该是1381这样的数据(例如应该是08/01/2013),那么在尝试转换此列时是否会导致问题?

2 个答案:

答案 0 :(得分:0)

而不是将格式化的日期存储在单独的列中;只需在使用STR_TO_DATE函数获取时更正格式(如您所说,您的日期存储为字符串/ varchar),如下所示。同样,正如其他人建议不要将date数据存储为字符串而是使用datetime数据类型而不是

SELECT  STR_TO_DATE(`Date`, '%m/%d/%Y')
FROM    yourtable

修改

在这种情况下,我建议不要更新原始表格。而是将此格式化数据存储在view或单独的表中,如下所示

create view formatted_date_view
as
    SELECT  ID,STR_TO_DATE(`Date`, '%m/%d/%Y') as 'Formatted_Date'
    FROM    yourtable

(OR)

create table formatted_date_table
 as
SELECT  ID,STR_TO_DATE(`Date`, '%m/%d/%Y') as 'Formatted_Date'
FROM    yourtable

<强> EDIT1:

如果SQL Server使用CONVERT函数,如CONVERT(datetime, Date,110)。所以,它将是(这里的110是mm-dd-yyyy格式的风格)

    SELECT  ID,convert(datetime,[Date],110) as 'Formatted_Date'
    FROM    yourtable

(OR)

CAST功能如下(唯一的缺点,你不能使用任何特定的样式来格式化日期)

    SELECT  ID, cast([Date] as datetime) as 'Formatted_Date'
    FROM    yourtable

答案 1 :(得分:0)

MS SQL Server解决方案

  

您正在尝试使用哪种SQL?

     

MSSQL Server 2008 R2

您可以在Convert字段中使用date功能。您必须指定日期格式样式 对于mm/dd/yyyy格式,样式值为101

使用样式值,您的更新语句可以是:

UPDATE table_name
  SET date = CONVERT( VARCHAR, date, 101 ) 

参阅


MySQL解决方案

  

它需要保留在varcharint且日期为yyyymmdd,我需要将数千行数据更改为mmddyyyy格式

使用date更改为str_to_date类型,然后使用date_format再次更改为字符串。

UPDATE table_name
  SET date = DATE_FORMAT( STR_TO_DATE( date, '%Y%m%d' ), '%m%d%Y' )

20140911转换为yyyymmdd格式时,值mmddyyyy会将前导0保留为09112014

  

加分问题 :如果9121209/12/2012等数据在尝试转换此列时会导致问题吗?或类似1381的内容应该是08/01/2013

您可以使用str_to_date( '91212', '%c%e%y' )将其转换为有效的date对象。但MySQL虽然定义为支持单个数字monthdate数字,但它无法正确解析此类日期,并在此类格式上返回NULL

mysql> select str_to_date( '91212', '%c%e%y' ) s1, str_to_date( '091212', '%c%e%y' ) s2;
+------+------------+
| s1   | s2         |
+------+------------+
| NULL | 2012-09-12 |
+------+------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+------------------------------------------------------------+
| Level   | Code | Message                                                    |
+---------+------+------------------------------------------------------------+
| Warning | 1411 | Incorrect datetime value: '91212' for function str_to_date |
+---------+------+------------------------------------------------------------+
1 row in set (0.00 sec)