As has been mentioned in the comments, it is preferable to use qsort, (if one doesn't care about stability.) One needs a function pointer, which is compare_dates in the code below.
#include <stdlib.h> /* EXIT*, rand, qsort */
#include <stdio.h>  /* *printf */
#include <time.h>   /* clock */
#include <assert.h> /* assert */
struct Date { int anio, mes, dia; };
/** Random [i, j]. https://stackoverflow.com/a/6852396/2472827
 This is just used for test purposes. */
static int rand_range(const int i, const int j) {
    const unsigned long max = (unsigned long)j - i,
        num_bins = max + 1l,
        num_rand = (unsigned long)RAND_MAX + 1,
        bin_size = num_rand / num_bins,
        defect   = num_rand % num_bins;
    unsigned long x;
    assert(i <= j && num_bins <= RAND_MAX);
    do { x = 1l * rand(); } while (num_rand - defect <= x);
    return i + x / bin_size;
}
/** Initiaises the date with random. */
static void init_date(struct Date *const date) {
    assert(date);
    date->anio = rand_range(1950, 2050);
    date->mes  = rand_range(1, 12);
    date->dia  = rand_range(1, 30); /* Approximately. */
}
/** Prints the date in a static string.
 Assumes the date is sanitised, or else this presents a risk of overflow. */
static const char *print_date(const struct Date *const date) {
    static char print[128]; /* Should be 11 if -999 <= year < 9999. */
    assert(date);
    sprintf(print, "%4.4d-%2.2d-%2.2d", date->anio, date->mes, date->dia);
    return print;
}
/** The arguments must be const struct Date *.
 @return -, =, + */
static int compare_dates(const void *p, const void *q) {
    const struct Date *x = (const struct Date *)p, *y = (const struct Date *)q;
    assert(p && q);
    if(x->anio > y->anio) return 1;
    if(x->anio < y->anio) return -1;
    if(x->mes  > y->mes)  return 1;
    if(x->mes  < y->mes)  return -1;
    if(x->dia  > y->dia)  return 1;
    if(x->dia  < y->dia)  return -1;
    return 0;
}
int main(void) {
    struct Date dates[64];
    const size_t dates_size = sizeof dates / sizeof *dates;
    size_t i;
    /* Generate dates. */
    srand((unsigned)clock());
    for(i = 0; i < dates_size; i++) init_date(dates + i);
    /* Sort it using compare_dates. */
    qsort(dates, dates_size, sizeof *dates, &compare_dates);
    /* Print. */
    for(i = 0; i < dates_size; i++) printf("%s.\n", print_date(dates + i));
    return EXIT_SUCCESS;
}
See How to generate a random integer number from within a range.