Классическая сортировка списка дат ASP по годам, а затем по месяцам

У меня есть список дат в таком формате: ГГГГ-ММ-ДД.

Я хотел бы иметь возможность сортировать их по убыванию по годам (2013, 2012, 2011), а затем по возрастанию по месяцам (январь, февраль, март,...). Итак, что я ищу:

2013-01-01
2013-02-01
2013-03-01
2013-04-01
2013-05-01

2012-01-01
2012-02-01
2012-03-01
...
2012-12-01

2011-01-01
2011-02-01
2011-03-01
...
2011-12-01

Обратите внимание, что список за текущий год будет неполным до декабря, поэтому он идет только до 01.05.2013. Предыдущие годы будут завершены с января по декабрь.

Я сделал пузырьковую сортировку, подобную этой:

For i = 0 to Ubound(dateArray)
    For j = i + 1 to Ubound(dateArray) 
        if dateArray(i) > dateArray(j) then
            tempDate = dateArray(i)         
            dateArray(i) = dateArray(j)
            dateArray(j) = tempDate
        end if
    Next  
Next

но это дает мне список, который выглядит так:

2011-01-01
2011-02-01
2011-03-01
...
2011-12-01

2012-01-01
2012-02-01
2012-03-01
...
2012-12-01

2013-01-01
2013-02-01
2013-03-01
2013-04-01
2013-05-01

Близко, но не совсем.


person JFrancis    schedule 26.07.2013    source источник


Ответы (2)


Я видел это раньше... Я думаю, что так я решил это.

For i = 0 to Ubound(dateArray)
    For j = i + 1 to Ubound(dateArray) 
        if (year(dateArray(i)) < year(dateArray(j))) or (year(dateArray(i)) = year(dateArray(j)) and month(dateArray(i)) > month(dateArray(j)))then
            tempDate = dateArray(i)         
            dateArray(i) = dateArray(j)
            dateArray(j) = tempDate
        end if
    Next  
Next
person PopeDarren    schedule 26.07.2013
comment
ОПАСНЫЙ КОД: решает частный случай (все даты первого месяца), но в целом терпит неудачу (разные дни месяца). - person Ekkehard.Horner; 26.07.2013
comment
Хороший улов, Эккехард. Я использовал только предоставленные даты и рандомизировал. Это решение решает проблему, только если день месяца всегда первый. Я также рекомендую использовать решение Ansgar Wiechers. - person PopeDarren; 31.07.2013

Вам нужно отсортировать по возрастанию, когда год одинаков в обеих датах, и по убыванию, если год отличается:

Sub SwapValues(ByRef a, ByRef b)
    buf = a : a = b : b = buf
End Sub

...

If Year(dateArray(i)) = Year(dateArray(j)) Then
  If dateArray(i) > dateArray(j) Then
    SwapValues dateArray(i), dateArray(j)
  End If
Else
  If dateArray(i) < dateArray(j) Then
    SwapValues dateArray(i), dateArray(j)
  End If
End If

Я добавил процедуру замены значений, чтобы немного упростить код.

person Ansgar Wiechers    schedule 26.07.2013
comment
ПРАВИЛЬНОЕ РЕШЕНИЕ для всех случаев, потому что оно учитывает дни. - person Ekkehard.Horner; 26.07.2013