SQFlite rawquery для получения ближайшего datetime

Я программирую приложение для дня рождения и хочу использовать sqflite для сортировки ближайшей даты. Через страницу: запрос SQLite для получения ближайшего datetime, который я узнал насчет strftime, но, к сожалению, я не знаю, как его использовать с Flutter. Вот несколько примеров того, как отсортировать дату и как я пытаюсь найти текущую дату с помощью strftime.

Future<List<Map<String, dynamic>>> getSortDateMapListToDate(bool sort) async {
    Database db = await this.database;
    String sortingDirection = '$colDate DESC';
    if(!sort) {
      sortingDirection = '$colDate ASC';
    }

    DateTime test = DateTime.now();
    //var result = await db.query(dateTable, orderBy: sortingDirection);
    var result = await db.rawQuery('SELECT * from $dateTable orderBy abs(strftime("%s",$test) - strftime("%s", $colDate))');
    return result;
  }

Может есть еще одна возможность или кто-то уже работал с rawquerys и strftime.

Буду благодарен за любую подсказку или помощь.

РЕДАКТИРОВАТЬ: с помощью @heitor murara я редактирую свой код:

var result = await db.rawQuery(
        "SELECT s.id, s.name, s.date, s.priority, (strftime('%y-%m-%d', '2020-06-30') - strftime('%y-%m-%d', s.$colDate)) as 'TestDate' "
        "FROM $dateTable s "
        "ORDER BY  TestDate"
    );

даты, которые я использую: 30.06.2020 и с strftime ('% s) я получаю строки:

  • 2015-08-15 // 32 оставшихся дня
  • 2010-11-03 // 126 оставшихся дней
  • 2010-07-10 // 10 оставшихся дней
  • 1994-07-17 // 17 оставшихся дней
  • 1993-06-29 // 364 оставшихся дня

с strftime ('% y-% m-% d) я получаю строки:

  • 1994-07-17 // 17 оставшихся дней
  • 1993-06-29 // 364 оставшихся дня
  • 2015-08-15 // 32 оставшихся дня
  • 2010-11-03 // 126 оставшихся дней
  • 2010-07-10 // 10 оставшихся дней

чего я пытаюсь достичь:

  • 2010-07-10 // 10 оставшихся дней
  • 1994-07-17 // 17 оставшихся дней
  • 2015-08-15 // 32 оставшихся дня
  • 2010-11-03 // 126 оставшихся дней
  • 1993-06-29 // 364 оставшихся дня

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

Есть у кого-нибудь подсказка? :)


person HD-Media24    schedule 28.06.2020    source источник


Ответы (1)


Используемая вами функция strftime() делает следующее:

Подпрограмма strftime () возвращает дату, отформатированную в соответствии со строкой формата, указанной в качестве первого аргумента.

Итак, если бы все ваши даты были в таком формате: 2020-06-28, вы могли бы просто запустить rawQuery, чтобы сделать заказ:

SELECT d FROM datetime_text ORDER BY d ASC;

Однако, если это не так, вы можете использовать функцию strftime() для форматирования даты в следующем порядке:

SELECT strftime('%Y-%m-%d', d) FROM datetime_text ORDER BY d ASC;

Даты будут возвращены примерно так:

2020-06-27
2020-06-28
2020-06-28
2020-06-28
2020-06-29

В вашем примере я считаю, что вы можете достичь того, чего хотите, с помощью чего-то вроде этого:

var result = await db.rawQuery("SELECT strftime('%Y-%m-%d', <column-name>) FROM $dateTable ORDERBY $sortingDirection");

Как видите, я заменил * из вашего запроса на <column-name>, просто обновите его, указав имя столбца.

Ps .: Поскольку вы работаете с днями рождения, формат '%Y-%m-%d' подойдет, вам также не нужно использовать время.

person hfelpp    schedule 28.06.2020
comment
Спасибо. Ваш совет привел меня к дальнейшим действиям, но, к сожалению, еще не достиг желаемого результата. - person HD-Media24; 30.06.2020
comment
Чего не хватает? - person hfelpp; 30.06.2020
comment
Извините за задержку, здесь прошел через циклон ... Нет необходимости использовать структуру вычитания в вашем запросе или высмеивать дату 2020-06-30, не имеет смысла, просто используйте ORDER BY, как в примере - person hfelpp; 02.07.2020
comment
Что-то вроде этого я себе представляю: SELECT id, name, (strftime ('% Y-% m-% d', date)), priority FROM $ dateTable ORDER BY date ASC - person hfelpp; 02.07.2020
comment
К сожалению, этот запрос дает только отсортированную последовательность по возрасту. Тем не менее я благодарю вас, сейчас я написал запрос, который дает желаемый результат. - person HD-Media24; 04.07.2020