标准化 SQL 表中的列

Posted

技术标签:

【中文标题】标准化 SQL 表中的列【英文标题】:Standardizing a column in an SQL Table 【发布时间】:2014-03-31 14:00:03 【问题描述】:

我的 SQL 表中有一个名为“日期”的列,其中日期以不同的格式存储,例如: 2000 年 5 月 25 日, 2013 年 6 月 1 日, 1996 年 5 月 1 日, 1990 年 1 月 23 日等

我想将所有这些日期转换为单一格式,例如DD/MM/YYYY 或 MM/DD/YYYY。我该怎么做?

【问题讨论】:

“日期”列的数据类型是什么?我猜它是varchar()。你怎么知道任何日期的格式? 我同意其他人的观点——类型应该是日期时间。我尝试运行 UPDATE Dates SET stringdates = CONVERT(varchar, CAST(stringdates as datetime), 101) 之类的东西,但它无法处理所有不同类型的日期 有一种简单的方法可以将 char 转换为 datetime,但无法识别每一行中的格式。 知道5/1/1996代表什么日期吗?那是一月还是五月的一天? 我的“日期”列的数据类型是 varchar。基本上,我正在开发一个 ETL 应用程序,我正在从不同的来源中提取数据,这些来源可能包含包含不同格式日期的表格。我想要一种格式的所有日期... 【参考方案1】:

使用 DATE 数据类型作为存储类型,并将格式化留给前端。

【讨论】:

DATE 数据类型仅是自 sql 2008 以来的有效类型(即 2008、2008 R2 和 2012)。如果 SQL Server 的版本不能使用 DATE,可能只能使用 DATETIME 或 SMALLDATETIME 当然,但是 2005 年已经过去了 9 年和四个版本(2014、2012、2008r2、2008),而且问题没有被标记为 2005,是吗? :) 此外,DATE 似乎比 DATETIME 更适合现有值。【参考方案2】:

试试这个!

create table Table(DateColumn varchar(20))

insert into Table values ('25/5/2000'), ('25052000'), ('5/1/1996'),('jan-23-1990'),(05012000)

select
  case len(DateColumn)
    when 10 then convert(date, DateColumn, 103)
    when 8 then convert(date, stuff(stuff(DateColumn, 5, 0, '/'), 3, 0, '/'), 103)
    when 6 then convert(date, stuff(stuff(DateColumn, 5, 0, '/'), 3, 0, '/'), 3)
    when 11 then convert(date,Datecolumn,103)
-- depending on string length you may query this   
end
from table

【讨论】:

这给了我以下错误:“从字符串转换日期和/或时间时转换失败”【参考方案3】:

如果您尝试在您的列中转换日期,请使用此示例网站了解您要完成的工作,希望这对您有所帮助,谢谢。 http://www.codeproject.com/Articles/576178/cast-convert-format-try-parse-date-and-time-sql

【讨论】:

以上是关于标准化 SQL 表中的列的主要内容,如果未能解决你的问题,请参考以下文章

神奇的 SQL 之层级 → 为什么 GROUP BY 之后不能直接引用原表中的列

如何组合熊猫数据透视表中的列?

如何使用 SQL 或 Python 在下面提到的标准中查找表中的唯一记录(在所有列中)?

下面的 SQL 的 GORM(grails) 标准是啥?

MySQL学习笔记

在新的 BigQuery 标准 SQL 的数组中使用结构