从sql server表中选择最大日期保存为" mm-yyyy"中的varchar数据。格式

时间:2015-02-05 06:58:13

标签: sql-server sql-server-2008 sql-server-2008-r2

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

现在我想要检索MAX日期。

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

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:00.000,因为MAX日期保存为1-2015

3 个答案:

答案 0 :(得分:1)

你可以尝试:

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

<强> RESULT

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

答案 1 :(得分:0)

你可以试试。

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

答案 2 :(得分:0)

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

SELECT MAX(CONVERT(DATETIME, STUFF([Date], CHARINDEX('-', [Date]), 0, '-1'), 121))