Поле DATE и нулевые дни и месяцы, сортировка

ortick

Новичок
Поле DATE и нулевые дни и месяцы, сортировка

Имеем данные о выпуске, скажем, каких-либо товаров.
В базе у нас поле DATE (0000-00-00).
На некоторые товары у нас есть данные полные, т.е. день, месяц, год, на некоторые только месяц, а на остаток только год.

Сейчас у нас в базе встречаются данные вида:

2009-10-10 - это полные данные
2009-10-00 - это данные с неизвестным днем
2009-00-00 - это данные, где известны только года

При выводе мы проверяем не нулевая ли одна из позиций и показываем на основе данных вот так (на примере вышеуказанного):
10 октября 2009г.
октябрь 2009г.
2009г.

Так вот в чем вопрос, при сортировке нам нужно выводить данные в порядке:
1. известен день, месяц, год
2. известен месяц, год
3. известен год.

т.е. опять таки для указанного примера должно быть:

1. 2009-10-10
2. 2009-10-15
3. 2009-10-00 (!!!)
4. 2009-11-01
5. 2009-12-10
6. 2009-12-00 (!!!)
7. 2009-00-00
8. 2010-01-01
9. 2010-01-00 (!!!)
10. 2010-00-00

ну и т.д.

при простой сортировке ORDER BY date

получается так:

3. 2009-10-00 (!!!)
1. 2009-10-10
2. 2009-10-15
4. 2009-11-01
6. 2009-12-00 (!!!)
5. 2009-12-10
7. 2009-00-00
9. 2010-01-00 (!!!)
8. 2010-01-01
10. 2010-00-00

т.е. нулевые идет первые, что и понятно по логике (0,1,2...9)

можно ли как-то сделать чтобы сортировка шла по нужному нам порядку? (1-ый вариант).

Спасибо за любые наводки.
 

ortick

Новичок
Армян
не то.
нужно сортировать так, чтобы нули шли последними, т.е. не 0,1,2..9, а 1,2,3...9,0
 

Армян

Новичок
PHP:
SELECT *, DAY(`date`) FROM `dates`
ORDER BY YEAR(`date`) ASC, 
IF(MONTH(`date`)=0, 'MONTH(`date`)=0', ''), MONTH(`date`),
IF(DAY(`date`)=0, 'DAY(`date`)=0', ''), DAY(`date`)
Вроде оно =)
 

zerkms

TDD infected
Команда форума
Армян
IF(MONTH(`date`)=0, 'MONTH(`date`)=0', '')
что делает эта строка? объясни словами.

[sql]
ORDER BY YEAR(`date`), IF(MONTH(`date`) = 0, 10, MONTH(`date`)), IF(DAY(`date`) = 0, 10, DAY(`date`))
[/sql]
может так?
 

Армян

Новичок
А ты пробовал так? у меня выдает не то что нужно ТСу

что делает эта строка? объясни словами.
Это я экспериментировал и так и оставил, правильнее будет так:
PHP:
SELECT *, DAY(`date`) FROM `dates`
ORDER BY YEAR(`date`) ASC, 
IF(MONTH(`date`)=0, 1, 0), MONTH(`date`),
IF(DAY(`date`)=0, 1, 0), DAY(`date`)
Если месяц равен 0, то подставляется "1" в место сортируемого поля, и строка подставляется в конец (по месецам), оставшиеся сортируются по возрастанию.
 

zerkms

TDD infected
Команда форума
Код:
mysql> SELECT `date`, IF (MONTH (`date`) = 0, 13, MONTH (`date`)), IF (DAY (`date`) = 0, 32, DAY (`date`)) FROM `c` ORDER BY YEAR (`date`), IF (MONTH (`date`) = 0, 13, MONTH (`date`)), IF (DAY (`date`) = 0, 32, DAY (`date`));
+------------+---------------------------------------------+-----------------------------------------+
| date       | IF (MONTH (`date`) = 0, 13, MONTH (`date`)) | IF (DAY (`date`) = 0, 32, DAY (`date`)) |
+------------+---------------------------------------------+-----------------------------------------+
| 2009-02-01 |                                           2 |                   1 |
| 2009-02-00 |                                           2 |                  32 |
| 2009-00-00 |                                          13 |                  32 |
+------------+---------------------------------------------+-----------------------------------------+
3 rows in set (0.00 sec)
Если месяц равен 0, то подставляется "1" в место сортируемого поля, и строка подставляется в конец (по месецам), оставшиеся сортируются по возрастанию.
лишнее действие. можно и без него.
 
Сверху