2013-04-25 55 views
1

我查询的数据库有一个用户表,其中包含用户为网站注册的日期。如何按日期排列列未格式化的日期?

日期输入到VARCHAR列没有适当的日期格式是这样的:

Apr 18 2013 12:27PM 

当我SELECT MAX (dateColumn)我得到一个值跨越日期的范围大约一半。我已经考虑使用子字符串来抓取年份,然后是月份,然后是日期并按顺序排列。问题是,先从天日期以0将一个字符缩短这样的:

May 1 2013 12:27PM 

有一个简单的方法来找到最高日起,在不改变数据库的结构?

+2

您不应该将日期存储在varchar列中。而你的问题是这个错误的直接结果。我强烈建议将该列更改为真正的“DateTime”并迁移数据。 – 2013-04-25 10:13:08

+0

是的,不幸的是,它不是我,使网站/分贝。由于已有200多个用户,我无法更改数据库。 – blarg 2013-04-25 10:15:00

+2

当然可以。添加一个新列,将数据从旧列迁移到新列。放下旧的专栏。调整你的应用。这是标准的模式迁移(无论如何您都需要这样做),用户数量与此无关。 – 2013-04-25 10:17:24

回答

2

尝试在SQLServer中的数据类型之间的转换(包括日期格式)hereselect max(convert(datetime, dateColumn, 109))

的进一步信息。

+0

109表示什么? – blarg 2013-04-25 10:30:58

+0

@JackDamery:第三个参数是从字符字段转换为日期字段时使用的格式; 109表示mon dd yyyy hh:mi:ss:mmmAM(或PM) - 您也可以使用100。您可以在这里查看完整的日期格式列表以及有关在数据类型之间转换的更多信息:http://msdn.microsoft.com/zh-cn/library/ms187928%28v=sql.90%29.aspx – 2013-04-25 10:36:02

0

将列转换为具有格式为“YYYYMMDD”格式的值,然后对该列进行排序。

0

尝试将varchar转换为datetime格式并执行。您应该以相同的格式保存日期。它只是将varchar转换为datetime的例子。

Select * from tblName 
    where Convert(datetime, Convert(varchar(12),DOJ,106)) as DOJ >= 
      Convert(datetime, Convert(varchar(12),'2013-04-28',106))