дата заказа для значений с неизвестным днем ​​и месяцем - PullRequest
0 голосов
/ 17 апреля 2020

Я разрабатываю сайт с событиями из прошлого. Для некоторых событий известна вся дата, для некоторых - месяц года, а для некоторых - только год. Событие таблицы выглядит следующим образом:

id
content
date -> YYYY-MM-DD (date data type)
year -> true, if only year is known, otherwise false
monthandyear -> true if only year and month is known, otherwise false

Я бы хотел перечислить содержимое таблицы в следующем порядке:

  • по убыванию по дате
  • , если только известны месяц и год (для monthandyear установлено значение true), контент должен быть указан как последний в этом месяце
  • , если известен только год (для года установлено значение true), контент должен быть указан как последний год того года

Как лучше всего решить эту проблему?

Я использую DQL:

SELECT p FROM App:Event p ORDER BY p.date DESC ...

Ответы [ 2 ]

2 голосов
/ 17 апреля 2020

Вы можете использовать условные логи c. Предполагая, что date является строкой:

order by left(date, 4),
         (case when not year and not yearmonth then 1 else 2 end),
         left(date, 7),
         (case when not yearmonth then 1  else 2 end)
         date

Редактировать:

Если date имеет тип date, то:

order by year(date),
         (case when not year and not yearmonth then 1 else 2 end),
         month(date),
         (case when not yearmonth then 1  else 2 end)
         date
0 голосов
/ 17 апреля 2020

Я решил проблему, используя ответ Гордона. В DQL это выглядит так:

$this->getEntityManager()
     ->createQuery(
            'SELECT '
                . 'p, '
                . '(CASE WHEN (p.year = :yes) THEN 1 ELSE 2 END) as HIDDEN ORD1, '
                . '(CASE WHEN (p.monthandyear = :yes) THEN 1 ELSE 2 END) as HIDDEN ORD2 '
                . 'FROM App:Event p '
                . 'ORDER BY SUBSTRING(p.dateandtime, 1, 4) DESC, ORD1 DESC, SUBSTRING(p.dateandtime, 1, 7) DESC, ORD2 DESC, p.dateandtime DESC'  
        )
        ->setParameters(array("no" => false, "yes" => true))
        ->getResult();
...