Расчет предложения SQL WHERE в дате для ранжирования - PullRequest
1 голос
/ 25 августа 2011

У меня есть проект, в котором модуль должен отображать список данных, используя группу определенных критериев:

Today
Week
Month
Year

Таблица базы данных содержит поле даты с типом данных как BIGINT (10) и черезPHP-код мы вставляем в него значение функции time ().который вставляет какое-то значение, например 1311144077,

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

Ответы [ 3 ]

5 голосов
/ 25 августа 2011

Пока вы храните дату и время в формате метки времени, я думаю, что решения, использующие функции даты / времени MySQL, могут быть очень медленными. Поэтому я предлагаю использовать саму метку времени, как показано ниже.

Пример использования

$t = time();

# today
echo date('Y-m-d H:i:s', strtotime('today', $t))."\n";
echo date('Y-m-d H:i:s', strtotime('tomorrow', $t))."\n";

# this week  
echo date('Y-m-d H:i:s', strtotime('-1 sunday', $t))."\n";
echo date('Y-m-d H:i:s', strtotime('sunday', $t))."\n";

# this month  
echo date('Y-m-d H:i:s', strtotime(date('Y-m-01 00:00:00', $t)))."\n";
echo date('Y-m-d H:i:s', strtotime(date('Y-m-01 00:00:00', strtotime('next month', $t))))."\n";

# this year
echo date('Y-m-d H:i:s', strtotime(date('Y-01-01 00:00:00', $t)))."\n";
echo date('Y-m-d H:i:s', strtotime(date('Y-01-01 00:00:00', strtotime('next year', $t))))."\n";

В запросе

# this year
$start_of_year = strtotime(date('Y-01-01 00:00:00', $t));
$end_of_year = strtotime(date('Y-01-01 00:00:00', strtotime('next year', $t)));
$query = "SELECT * FROM sometable WHERE somecolumn >= $start_of_year AND somecolumn < $end_of_year";
0 голосов
/ 25 августа 2011

эта команда изменит метку времени, сохраненную в дате базы данных ("j F, Y", "1222041600"), на 1-6-1987, тогда у вас будет месяц и год, и по этому вы также можете рассчитать неделю.Смотрите php функции даты для более подробной информации.

0 голосов
/ 25 августа 2011

Вы можете получить отметку времени нижней границы с функцией strtotime(), например. strtotime('-1 week'), а затем запросите в вашей базе данных все записи со значением поля даты больше этого.

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

$ts = strtotime('-1 week');
// or $ts = strtotime('date'); where date can be a date in Y-m-d format
mysql_query("SELECT * FROM table WHERE your_bigint_column >= $ts");

Если вам нужно сгруппировать по месяцам, вы можете просто использовать MySQL для обработки дат :

SELECT WEEK(FROM_UNIXTIME(your_bigint_column)) AS no_of_week, count(*)
FROM table
GROUP BY WEEK(FROM_UNIXTIME(your_bigint_column))
<ч />

На несвязанной ноте - BIGINT (10) - это перебор, результат time () можно безопасно сохранить в столбце INT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...