SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 06.11.2008 11:50:52

DmitriyZ
Участник
Зарегистрирован: 06.11.2008
Сообщений: 5

Запрос. Сортировка по датам.

Здравствуйте. Есть следующая таблица:

CREATE TABLE `table` (
`name` VARCHAR( 50 ) NOT NULL ,
`date_start` DATE NULL ,
`date_end` DATE NULL
) TYPE = MYISAM ;

Требуется сделать выборку и отсортировать по разности дат date_end-date_start, причем если date_end=null тогда брать текущую дату.
Спасибо.

Неактивен

 

#2 06.11.2008 12:50:43

Sign
Гуру
Зарегистрирован: 26.06.2008
Сообщений: 43

Re: Запрос. Сортировка по датам.

Видимо можно красивей, но так должно работать

select name, date_start, date_end,
    UNIX_TIMESTAMP(IFNULL(date_end,now())) - UNIX_TIMESTAMP(date_start) diff
from table_tmp
order by diff;
 

Неактивен

 

#3 19.11.2008 22:51:04

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Запрос. Сортировка по датам.

Имхо можно без UNIX_TIMESTAMP:


SELECT name, date_start, date_end
FROM table_tmp
ORDER BY IFNULL(date_end, NOW()) - date_start;

(должна отнимать даты как числа, а не как строки, я думаю)

Неактивен

 

#4 19.11.2008 23:21:41

Sign
Гуру
Зарегистрирован: 26.06.2008
Сообщений: 43

Re: Запрос. Сортировка по датам.

LazY написал:

Имхо можно без UNIX_TIMESTAMP:

Вы почти правы - конечно можно и без timestamp, но чуть-чуть не так ; )


Посмотрите что вернёт запрос:
select name, date_start, date_end,
    DATEDIFF(IFNULL(date_end, NOW()), date_start) as "diff",
    IFNULL(date_end, NOW()) - date_start as "diff2"
from (
    select
        'a' as "name",
        STR_TO_DATE('10/11/2008','%d/%m/%Y') as "date_start",
        STR_TO_DATE('13/11/2008','%d/%m/%Y') as "date_end"
    union
    select
        'b' as "name",
        STR_TO_DATE('11/11/2008','%d/%m/%Y') as "date_start",
        null as "date_end"
    union    
    select
        'с' as "name",
        STR_TO_DATE('11/11/2008','%d/%m/%Y') as "date_start",
        STR_TO_DATE('13/11/2008','%d/%m/%Y') as "date_end"
) ss
order by diff;

(name *, date_start, date_end, diff, diff2) VALUES
('c', '11.11.2008 0:00:00', '13.11.2008 0:00:00', '2', '-20079103'),
('a', '10.11.2008 0:00:00', '13.11.2008 0:00:00', '3', '-20079102'),
('b', '11.11.2008 0:00:00', '', '8', '-20079103')

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson