Готовим запрос в базу с временными интервалами

5 мая 2015

Как-то пришлось заниматься "извлечением" данных из таблицы заказов (пусть это будет таблица orders) за разные промежутки времени, выбираемые администратором. Интервалы были такими : За сегодня, За вчерашний день, За текущий календарный месяц, За прошлый месяц, За текущий год, За прошлый год. Поскольку в таблице было поле 'order_time' с временем заказа, в формате Date-Time, нужно было подготовить примерно такой sql запрос :

SELECT 'Что-то' FROM `orders` WHERE `order_time` BETWEEN '$start' AND '$stop';

Где $start и $stop соответственно время начала и конца запрашиваемого интервала в формате метки времени

к примеру так с "2013-04-12 00:00:00" по "2013-05-12 23:59:59"

Поскольку интервал, выбираемый админом, планировался посылатьcя в базу AJAX-ом (а сердцем любого AJAX является javascript), написал коротенький скрипт, вычисляющий нужные интервалы исходя из текущего времени. Может кому пригодиться.....

Итак, собственно, скрипт и пояснения: (тут приведен .html вариант для запуска в браузере и просмотра результатов в отладочной консоли). Сначала создаем обьект Date и назначаем ему переменную current_time, которая становиться обьектом со своими свойствами. Поскольку обьект создан без параметров,

то он возвращает текущее время. Обращаясь к свойствам этого обьекта : getFullYear - получаем текущий год из четырех цифр, getMonth - текущий месяц и getDate - текущую дату, все это назначаем соответствующим переменным:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Временные интервалы</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script language="JavaScript">
<!--
current_time = new Date();
var current_year = current_time.getFullYear();
var current_month = current_time.getMonth();
var current_date = current_time.getDate();

Начнем с интервала за сегодня, - тут все просто "склеиваем" текущую дату с началом дня - "00:00:00" и с его завершением "23:59:59". Конструкция console.log() вставлена для отладки и в реальном скрипте естественно не присутствует.

    //За сегодня
var start = +current_year+'-'+current_month+'-'+current_date+' 00:00:00';
console.log('сегодня старт '+start);
var stop = +current_year+'-'+current_month+'-'+current_date+' 23:59:59';
console.log('сегодня стоп '+stop);

За вчера, - тут создаем новый обьект Date, но уже с параметрами - текущий год, текущий месяц и текущая дата минус 1 что дает вчера -)). Дальше опять склейка с часами и минутами, начала и конца дня

    //вчера
var yesterday = new Date(current_year,current_month,(current_date-1));
var start = +yesterday.getFullYear()+'-'+(yesterday.getMonth()+1)+'-'+yesterday.getDate()+
' 00:00:00';
    console.log('вчера старт '+start);
    var stop = +yesterday.getFullYear()+'-'+(yesterday.getMonth()+1)+'-'+yesterday.getDate()+
    ' 23:59:59';
console.log('вчера стоп '+stop);

Текущий календарный месяц - создаем снова обьект Date с параметрами текущий год, текущий месяц +1(так как отсчет месяцев идет с нуля), и,наконец, число 1 - первое число месяца. Дальше опять склейка с временем часы,минуты.

    //первый день текущего месяца
var first_current_month_day = new Date(current_year,current_month,1);
    // текущий месяц
var start = +first_current_month_day.getFullYear()+'-'+(first_current_month_day.getMonth()+1)
+'-'+first_current_month_day.getDate()+' 00:00:00';
console.log('текущий месяц '+start);
var stop = +current_year+'-'+(current_month+1)+'-'+current_date+' 23:59:59';
console.log('Текущий месяц '+stop);

Прошлый месяц тут сначала ничего необычного - новый обьект Date с параметрами текущий год, текуший месяц минус 1,что относит нас в прошлый месяц и первое число прошлого месяца опять единица -)).

    //прошлый месяц
    //первый день прошлого месяца
var last_month_first_day = new Date(current_year,(current_month-1),1);
var start = +last_month_first_day.getFullYear()+'-'+(last_month_first_day.getMonth()+1)+'-'
+last_month_first_day.getDate()+' 00:00:00';
console.log('первый день прошлого месяца '+start);

И, вот затем, начинается самое интересное - вычисление того, сколько дней в прошлом месяце. Ведь оно, это число, все время разное и зависит от месяца и года (высокосного например).Приведенное тут решение не мое, нашел его, как всегда, в паутине интернета, но оно мне понравилось своей изящностью. Дело в том, что если в качестве аргумента в обьект Date ввести заведомо несуществующее значение, например, дату 32 в месяце, которой не существует, то этот обьект вернет дату начала следующего месяца со сдвигом на столько дней, на сколько мы "ошиблись". Так и поступим, подав в качестве аргументов во вновь создаваемый обьект, текущий год, прошлый месяц и 32-е его число!!! .Осталось вычесть из одного другое - и вот , правильное число дней в месяце. Медитируем.....

    //вычисляем сколько дней в прошлом месяце
var day_count = 32 - new Date(current_year,(current_month-1), 32).getDate();
var stop = +last_month_first_day.getFullYear()+'-'+(last_month_first_day.getMonth()+1)+'-'
+day_count+' 23:59:59';
console.log('последний день прошлого месяца '+stop);

Дальше все очень просто, и после предыдущих строк, обьяснять то нечего, за исключением того, что месяцы считаются с нуля и 0 - это январь а 11 - декабрь. В самом конце завершаем наш скрипт и в тэге body пишем коротенькую памятку. Осталось соединить все куски кода этого поста в один .html файл и запустить в браузере. Я проверял интервалы, меняя системную дату назад и вперед, вроде, все определяется верно. Может кто заметит неточность - пишите.

    //первый день текущего года
var first_current_year_day = new Date(current_year,0,1);
    // текущий год
var start = +first_current_year_day.getFullYear()+'-'+(first_current_year_day.getMonth()+1)
+'-'+first_current_year_day.getDate()+' 00:00:00';
console.log('первый день текущего года '+start);
var stop = +current_year+'-'+(current_month+1)+'-'+current_date+' 23:59:59';
console.log('последний день текущего года '+stop);
    //прошлый год
    //первый день прошлого года
var first_last_year_day = new Date((current_year-1),0,1);
var start = +first_last_year_day.getFullYear()+'-'+(first_last_year_day.getMonth()+1)+'-'
+first_last_year_day.getDate()+' 00:00:00';
console.log('первый день прошлого года '+start);
var stop = +first_last_year_day.getFullYear()+'-'+(new Date((current_year-1),11,31).getMonth()+1)
+'-'+new Date((current_year-1),11,31).getDate()+' 23:59:59';
console.log('последний день прошлого года '+stop);
-->
</script>
</head>
<body>
Откройте консоль, чтобы прочитать временные интервалы :<br />
FireFox,Chrome - F12<br />
Opera - Ctrl+Shift+i - консоль
</body>
</html>
Теги: javascript