sql – 将varchar MMDDYYYY转换为MM / DD / YYYY日期时间并仅选择最近的日期

好吧,所以我有一个奇怪的问题……表格中的日期已经输入为字符串值MMDDYYYY,我试图在报告中显示为MM / DD / YYYY,只选择最新的与ID相关的日期,因为某些ID可能有多个日期.

我的表示例:

  ID  |  MyDate  |
------+----------+
  1   | 01302014 |
  1   | 04222014 |
  2   | 01302014 |

当我选择并插入临时表时,我想看到的是:

  ID  |   MyDate  |
------+-----------+
  1   | 4/22/2014 |
  2   | 1/30/2014 |

我知道将日期存储为字符串值是一种不好的做法,特别是在将它们存储为MMDDYYYY时,但是有没有人能够解决这个噩梦?

编辑

我忘了提一些字段可能是NULL.不确定这是否有所不同,但我认为如果我尝试使用Right,Left,Convert来翻转日期会有所作为.

最佳答案 这问题差不多一年前,坚果可能有人会发现它有用.

您需要将字符串转换为DATE格式,并使用ROW_NUMBER函数来窗口化结果集.

创建表格

DECLARE @tbl TABLE(Id INT, myDate VARCHAR(8))

样本数据

INSERT @tbl
SELECT 1  ,  '01302014' UNION ALL
SELECT 1  ,  '04222014' UNION ALL
SELECT 2  ,  '01302014'

询问

;WITH C AS(
    SELECT  ROW_NUMBER() OVER (PARTITION BY Id ORDER BY CONVERT(DATETIME, (SUBSTRING(myDate, 5, 4) + '.' + SUBSTRING(myDate, 1, 2) + '.' + SUBSTRING(myDate, 3, 2)), 101) DESC) AS Rn
            ,Id
            ,CAST(CONVERT(DATETIME, (SUBSTRING(myDate, 5, 4) + '.' + SUBSTRING(myDate, 1, 2) + '.' + SUBSTRING(myDate, 3, 2)), 101) AS DATE) AS myDate
    FROM @tbl
)
SELECT Id, myDate
FROM C
WHERE Rn = 1

SQLFiddle Demo

点赞