标准化 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 之后不能直接引用原表中的列