将varchar作为日期选择不同的前100名

时间:2017-01-03 21:03:04

标签: select casting sql-server-2012 varchar

我正在尝试修复新年后SSRS中出现的查询。我们有来自其他应用程序的输入。它抓取日期并将其存储为varchar。然后,SSRS报告会提取前100个日期'但是当2017年的日期到来时,这不在前100名。

现有查询如下

SELECT DISTINCT TOP (100)
FROM DenverTempData
ORDER by BY Date DESC

日期存储为VARCHAR。很明显,这个查询并没有抓住像01012017那样的值作为前100名(超过像12312016这样的值)。我想也许我可以简单地将此列的数据类型更改为datetime。但是信息来自平面文件并被转换,因此它更难一点。因此,我希望在将日期列转换为datetime或仅将日期转换为最后100个日期时,选择不同的前100名。

有人可以帮助查询语法吗?我正在考虑使用强制转换将varchar转换为date,但如何使用不同的前100名进行格式化?我只是想按照时间顺序从存储为varchar但包含代表date的字符串的列中检索最后100个日期。

希望这是有道理的

2 个答案:

答案 0 :(得分:1)

将日期存储为字符串始终是个坏主意。这是具有高度文化特色的!

您可以将格式化的字符串日期转换为如下所示的实际日期:

DECLARE @DateMMDDYYYY VARCHAR(100)='12312016';

SELECT CONVERT(DATE,STUFF(STUFF(@DateMMDDYYYY,5,0,'-'),3,0,'-'),110)

转换后,您的排序(以及TOP 100)应该按预期工作。

我的强烈建议:尝试将您的日期存储在实际日期类型的列中,以避免出现这种情况!

答案 1 :(得分:0)

SELECT  DISTINCT TOP 100 (CAST(VarcharColumn as Date) as DateColumn)
FROM TABLE
Order by DateColumn desc