Sql server 从“保存为varchar数据的sql server表”中选择“最大日期”;年月日;格式

Sql server 从“保存为varchar数据的sql server表”中选择“最大日期”;年月日;格式,sql-server,sql-server-2008,sql-server-2008-r2,Sql Server,Sql Server 2008,Sql Server 2008 R2,在表格中,日期数据保存为mm yyyy格式,其数据类型为varchar 现在我想检索MAXdate 日期以以下格式保存,有数千条记录: 7-1986 10-2012 6-1989 5-1975 7-1974 7-1961 12-1987 10-1975 6-1959 10-2002 12-1991 11-1961 6-1966 12-1959 10-1956 12-1953 6-1999 2-1989 我试过: SELECT MAX(CONVERT(DATETIME, '1-'+[Date]

在表格中,日期数据保存为mm yyyy格式,其数据类型为varchar

现在我想检索
MAX
date

日期以以下格式保存,有数千条记录:

7-1986
10-2012
6-1989
5-1975
7-1974
7-1961
12-1987
10-1975
6-1959
10-2002
12-1991
11-1961
6-1966
12-1959
10-1956
12-1953
6-1999
2-1989 
我试过:

SELECT MAX(CONVERT(DATETIME, '1-'+[Date], 105)) As MAXDate FROM tablename
但是它返回
2015-12-01 00:00:00.000
,但它应该是
2015-01-01 00:00.000
,因为
MAX
日期保存为
1-2015
,您可以尝试

SELECT Max(cast('1-'+Date as DateTime)) As MAXDate FROM tablename

您可以使用
STUFF
功能添加
-1

SELECT MAX(CONVERT(DATETIME, STUFF([Date], CHARINDEX('-', [Date]), 0, '-1'), 121))
你可以试试:

SELECT MAX(CAST(RIGHT(Datestring, 4) + RIGHT('00' + SUBSTRING(DateString, 1, CHARINDEX('-', DateString, 1) - 1), 2) + '01' AS SMALLDATETIME)) FROM [YourTable]
样本:

CREATE TABLE #Dates(DateString  VARCHAR(10))
INSERT INTO #Dates VALUES
('7-1986'), ('10-2012'), ('6-1989'),
('5-1975'), ('7-1974'), ('7-1961'),
('12-1987'), ('10-1975'), ('6-1959'),
('10-2002'), ('12-1991'), ('11-1961'),
('6-1966'),  ('12-1959'), ('10-1956'),
('12-1953'),  ('6-1999'), ('2-1989');

;WITH CTE AS(
    SELECT
        DateString,
        [Month] = SUBSTRING(DateString, 1, CHARINDEX('-', DateString, 1) - 1),
        [Year] = RIGHT(Datestring, 4),
        [Date] = CAST(RIGHT(Datestring, 4) + RIGHT('00' + SUBSTRING(DateString, 1, CHARINDEX('-', DateString, 1) - 1), 2) + '01' AS SMALLDATETIME)  
    FROM #Dates
)
SELECT MAX([Date]) AS MaxDate FROM CTE
数据

DateString
----------
7-1986
10-2012
6-1989
5-1975
7-1974
7-1961
12-1987
10-1975
6-1959
10-2002
12-1991
11-1961
6-1966
12-1959
10-1956
12-1953
6-1999
2-1989
结果

MaxDate
-----------------------
2012-10-01 00:00:00

你有什么办法可以换桌子吗?理想情况下,使用一个合适的日期字段(只记录每个月的第一天),但至少使用yyyy-MM。实际上有数百万条记录(2500万条),我无法更改格式。记录的数量很少影响更改它们的可行性-更多的是关于其他代码的数量(以及必须保持运行的系统)这会影响到这一点。同样,如果您可以使此更合理,从长远来看,这将为您节省大量时间。很抱歉,出现错误“从字符串转换日期和/或时间时转换失败”。请尝试更新后的答案。您每年只使用一个月。所以现在我加上'1-'抱歉,它仍然给出了错误的答案“2015-12-01 00:00:00.000”。@AnandMeena:你绝对确定表中没有“12-2015”的值吗?值得一查,我想…@Jon,对不起我的错误,表中有“12-2015”值。我把它拆了,现在它工作得很好,谢谢你的努力。