Помогите разобраться с датами

lexiks

Новичок
Помогите разобраться с датами

Подскажите как рассчитать...
Идет отбор по новинкам за 1 день, за 3 дня..., на неделю, за 2 недели. Соответственно передаются параметры 1,3,7,14.
я получаю текущюю дату... а как мне рассчитать дату на 2 недели раньше?
PHP:
$today=date("Ynd");   $date=$today-$chose;
если так то день предыдущего месяца начинает рассчитываться со 100...
 

matross

Новичок
<?php
$tomorrow = mktime (0,0,0,date("m") ,date("d")+1,date("Y"));
$lastmonth = mktime (0,0,0,date("m")-1,date("d"), date("Y"));
$nextyear = mktime (0,0,0,date("m"), date("d"), date("Y")+1);
?>
 

Sherlok Holms

Новичок
Чёто я не понял на щёт:
$tomorrow = mktime (0,0,0,date("m") ,date("d")+1,date("Y"));
$lastmonth = mktime (0,0,0,date("m")-1,date("d"), date("Y"));
$nextyear = mktime (0,0,0,date("m"), date("d"), date("Y")+1);
Что надо делать с этим?
 

alpine

Новичок
[sql]
SELECT * FROM `table` WHERE `date` BETWEEN DATE_SUB(CURDATE(), INTERVAL 14 DAY) AND CURDATE()
[/sql]
Вместо 14 подставляешь одно из {1,3,7,14}.
 

Sherlok Holms

Новичок
Большое спасибо!!!

-~{}~ 01.01.06 20:38:

Слушй ALPINE.Ещё такой вопрос, например мне надо удалить записи которые хранятся больше 7 дней.Так вот я пишу в SQL что :
delete from 'table' where 'date' between date_sub(curdate(),interval 7 day) and curdate();
И оно убирает те записи которые хранятся 7 дней, но и убирает те которые записаны сегодняшним днём.
Только не думай что я тебя прошу решыть мою задачу, а только подзкажы.
 

alpine

Новичок
Sherlok Holms
BETWEEN можно заменить выражением `date` >= "начальная дата" AND `date` <= "конечная дата"

-~{}~ 01.01.06 20:17:

вот тебе ссылочка для изучения
Операторы сравнения

-~{}~ 01.01.06 20:24:

И вообще странно, ты пишешь "мне надо удалить записи которые хранятся больше 7 дней" и делаешь совсем наоборот.
 

akira

Новичок
Прошу и мне помочь.
PHP:
-- 
-- Структура таблицы `journal`
-- 

CREATE TABLE `journal` (
  `id` int(11) NOT NULL auto_increment,
  `date` int(11) NOT NULL default '0',
  `header` mediumtext NOT NULL,
  `text` text NOT NULL,
  `show` enum('1','0') NOT NULL default '1',
  `public` enum('1','0') NOT NULL default '1',
  `id_cat` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `date` (`date`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=42 ;

-- 
-- Дамп данных таблицы `journal`
-- 

INSERT INTO `journal` VALUES (41, 1136195400, 'Дубль два', 'Еще одна проверка', '1', '1', 1);
INSERT INTO `journal` VALUES (40, 1136194891, 'Ура', 'Вот делаем проверку на время.', '1', '1', 1);
1136195400 - это дата.
Мне надо сделать выборку за определенное время.
За год, за месяц(его порядковый номер), за день.
Что-то в голову не приходит не чего =\
 

alpine

Новичок
akira
Поскольку timestamp ты формируешь в пхп то и готовить интервалы тоже желательно средствами пхп, для этого нужно использовать функцию [m]mktime[/m].
 

akira

Новичок
Хм, может лучше через UNIX_TIMESTAMP() тогда выполнять? Хотя какая разница?
 

alpine

Новичок
akira
Проще через mktime, imho

пример для выбора за месяц декабрь прошлого года для твоего случая средствами SQL.
[sql]
SELECT * FROM `table` WHERE
`date` >=
UNIX_TIMESTAMP(
CONCAT(YEAR(CURRENT_DATE)-1,'12','01')
)
AND
`date` <
UNIX_TIMESTAMP(
DATE_ADD(CONCAT(YEAR(CURRENT_DATE)-1,'12','01'), INTERVAL 1 MONTH)
)
[/sql]
 

akira

Новичок
Я решил так поступить.
PHP:
SELECT * FROM `journal` WHERE DAY (
FROM_UNIXTIME( `date` ) 
) =02
а дальше через AND.
Как быстрее? Как еще множно?
 

alpine

Новичок
akira
Я считаю это не правильный подход, так как выражение DAY (FROM_UNIXTIME( `date` ) ) =02 будет заново вычитслятся для каждой `date`и будет верным для 2го числа каждого месяца.

-~{}~ 02.01.06 18:58:

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

akira

Новичок
Изночальный смысл, что бы можно было сделать выборку по любому формату.
htttp://site.ru/part/2006/01/02 - запрос такой.
PHP:
SELECT * FROM `journal` WHERE 
YEAR ( FROM_UNIXTIME( `date` )  ) = 2006
 AND MONTH ( FROM_UNIXTIME( `date` )  ) = 01
 AND DAY ( FROM_UNIXTIME( `date` )  ) = 02;
htttp://site.ru/part/2006/01/ - запрос такой.
PHP:
SELECT * FROM `journal` WHERE 
YEAR ( FROM_UNIXTIME( `date` )  ) = 2006
 AND MONTH ( FROM_UNIXTIME( `date` )  ) = 01;
Мне кажеться это проще и более быстро.
 

akira

Новичок
Все понял :) Действительно выигрышь в скорости большой.
PHP:
SELECT * FROM `journal` WHERE `
date` >= UNIX_TIMESTAMP( CONCAT( YEAR( CURRENT_DATE ) -0, '01', '02' ) ) 
AND `date` < UNIX_TIMESTAMP( DATE_ADD( CONCAT( YEAR( CURRENT_DATE ) -0, '01', '02' ) , INTERVAL 1 MONTH ) );
Выборка идет по тем датам , что старше 2006 01 02, я верно понял?
CONCAT - обьеденение строк, а зачем?
PS alpine - спасибо.
 

alpine

Новичок
Выборка идет по тем датам , что старше 2006 01 02, я верно понял?
'2005-12-01' <= date < '2006-01-01' в моем запросе, а в твоем '2006-01-02' <= date < '2006-02-02'
CONCAT - обьеденение строк, а зачем?
[sql]
SELECT CONCAT( YEAR( CURRENT_DATE ) -0, '01', '02' )
[/sql]

-~{}~ 02.01.06 19:22:

PS в mysql тип DATE имеет формат YYYY-MM-DD
 

akira

Новичок
PHP:
SELECT * FROM `journal` WHERE `date` >= UNIX_TIMESTAMP( 20060102 ) AND
`date` < UNIX_TIMESTAMP( DATE_ADD( 20060102, INTERVAL 1 DAY ) )
IMHO CONCAT с YEAR тут не нужны.
Поля у меня int(11) :)
Еще раз спасибо, за мысль.
PS
Протестировал на скорость
1.
PHP:
SELECT * FROM `journal` WHERE
`date` >= UNIX_TIMESTAMP( 20060102 ) AND
`date` < UNIX_TIMESTAMP( DATE_ADD( 20060102, INTERVAL 1 DAY ) )
Запрос занял 0.0010 сек
2.
PHP:
SELECT * FROM `journal` WHERE
`date` >= UNIX_TIMESTAMP(DATE_FORMAT( NOW( ) , '%X%V%d' )) AND
`date` < UNIX_TIMESTAMP( DATE_ADD( DATE_FORMAT( NOW( ) , '%X%V%d' ) , INTERVAL 1 DAY ) )
Запрос занял 0.0011 сек
3.
PHP:
SELECT * FROM `journal` WHERE
` date` >= UNIX_TIMESTAMP( CONCAT( YEAR( CURRENT_DATE ) -0, '01', '02' ) )  AND
`date` < UNIX_TIMESTAMP( DATE_ADD( CONCAT( YEAR( CURRENT_DATE ) -0, '01', '02' ) , INTERVAL 1 MONTH ) );
Запрос занял 0.0026 сек
Отсюда я вижу, что есть смысл использовать номер 1.
Хотя придеться вводить дату через php.
 
Сверху