【问题标题】:Changing the format of data in a column更改列中数据的格式
【发布时间】:2014-04-17 17:09:18
【问题描述】:

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

例如:

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

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

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

额外问题:如果有数据,例如 09/12/2012 的 91212 或应该是 08/01/2013 的 1381 之类的数据,在尝试转换此列时会导致问题吗?

【问题讨论】:

  • 不要将日期存储为字符串。
  • 我相信这些日期被存储为 unix 时间戳,它只是客户端向您展示一种更易读的格式。
  • 而只是在选择时获取更正的格式日期
  • 如果您将它们存储为字符串......永远不要以 YYYYMMDD 以外的格式存储它们。您将失去对该数据的任何排序或范围选择的可能性。
  • 我完全同意。我只是在纠正所有垃圾数据时遇到困难的人。通过纠正过去,努力让未来的事情变得更顺利。

标签: sql sql-server


【解决方案1】:

而不是将格式化的日期存储在单独的列中;只需在使用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

(或)

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

(或)

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

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

【讨论】:

  • 我不想以正确的方式选择它。我想更改表中的数据。这样,将来插入的所有数据都将以统一的格式。 MMDDYYYY
  • STR_TO_DATE 不是可识别的内置函数名称。
  • @JaronCook,奇怪。不可能。它确实是一个内置函数;看这里dev.mysql.com/doc/refman/5.5/en/…
  • @JaronCook,再次查看已编辑的答案。这就是为什么你需要清楚你在问什么。
  • 我不是想成为一个痛苦的人,我非常感谢您的帮助,非常感谢。我想要完成的是将表中的所有字符串值从 YYYYMMDD 更改为 MMDDYYYY 字符串值,以便更新我的表。不使用 select 语句来改变我查看表格的方式。
【解决方案2】:

MS SQL Server 解决方案

您尝试使用哪种 SQL?

MSSQL Server 2008 R2

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

使用 with style 值,你的更新语句可以是:

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

参考


MySQL 解决方案

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

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

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

20140911yyyymmdd 转换为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)

【讨论】:

  • 当尝试使用 UPDATE table_name SET date = DATE_FORMAT( STR_TO_DATE( date, '%Y%m%d' ), '%m%d%Y' ) 我得到一个错误, str_to_date 是不是公认的内置函数名。
  • @JaronCook:太好了!!您正在尝试使用哪种 SQL?
猜你喜欢
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2021-01-06
  • 1970-01-01
  • 2016-01-14
  • 2017-09-03
相关资源
最近更新 更多