Фильтровать массив по дате с помощью php

0

Мне нужна помощь в фильтрации массива на дату.

В следующем запросе будет напечатан стол со всеми входами. Но я не буду фильтровать по дате. Если, например, сегодня есть "30 -12-2014", я хочу показать все записи с 30-12-2014 года и "новее", а не с первой записи, которая старше, чем "30 -12-2014".

"Destination.start_time" - это varchar2 с выходом вроде: 2014-11-28T15: 35: 00

В $ stid я обрезаю "destination.start_time" с помощью substr, поэтому вывод похож на "2014-11-28".

Но как включить фильтр?

Что-то вроде этого?

foreach ($row as $item)
    if ($item->dateitem >= $startDate  &&  
        $item->dateitem <= $endDate)
            $newarray[] = $item;

Не могли бы вы мне помочь?

С уважением, Ричи

-------------------------------------------------- - запрос php ----------------------------------------------- -----------

$stid = oci_parse($conn, "select 
customer.first_name as VOORNAAM, 
customer.last_name as ACHTERNAAM, 
substr(appointment.start_time,1,10) as DATUM,  
substr(appointment.start_time,12,10) as STARTTIJD, 
service_definitions.external_name as PRODUCT, 
appointment.resource_name as AGENDA 
from appointment 
inner join appointment_customer on appointment.id = appointment_customer.appointmentjpa_id inner join customer on customer.id = appointment_customer.customerids 
inner join appointment_service on appointment_service.appointment_id = appointment.id inner join service_definitions on service_definitions.id = appointment_service.service_id  order by appointment.start_time asc ");


    oci_execute($stid);

        while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
            echo " < tr > \n ";
            foreach ($row as $item)
           {
            echo "< td >" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "&nbsp;") . "< /td >\n";
            }
            echo "< /tr >\n";

------------------------------ РЕШЕНИЕ С ЗАПРОСОМ ----------------- -----------------

Привет всем, я решил свою проблему, добавив в запрос следующее:

where substr(appointment.start_time,1,10) >= TO_CHAR(SYSDATE, 'YYYY-MM-DD')

@krishna поставил меня на правильный путь. Я знаю, что есть все больше и лучших способов справиться с этим, но для меня это прекрасно работает.

Спасибо всем за помощь. С уважением Ричи

Теги:
arrays
date
filter

3 ответа

1
Лучший ответ

измените свой запрос следующим образом

SELECT
customer.first_name as VOORNAAM, 
customer.last_name as ACHTERNAAM, 
substr(appointment.start_time,1,10) as DATUM,  
substr(appointment.start_time,12,10) as STARTTIJD, 
service_definitions.external_name as PRODUCT
, appointment.resource_name as AGENDA
from appointment  where 
CONCAT(Year( STR_TO_DATE( appointment.start_time, '%Y-%m-%d %H:%i:%S' ) ),'-',Month( STR_TO_DATE( appointment.start_time, '%Y-%m-%d %H:%i:%S' ) ),'-',Day( STR_TO_DATE( appointment.start_time, '%Y-%m-%d %H:%i:%S' ) )) > '2014-12-30' order by appointment.start_time asc
  • 0
    Примечание: пожалуйста, старайтесь не хранить даты в виде строк
  • 0
    @RitchieTomasouw вы изменили что-нибудь из этого запроса
Показать ещё 5 комментариев
0

Используйте функцию array_filter. Я не знаю, как точно выглядят ваши данные, но вы можете выяснить, как это сделать на следующем примере:

$arr = [strtotime('now'), strtotime('now-1'), strtotime('now+1')]
array_filter($arr, function($elem) { return $elem > 1419935201; })

где 1419935201 - значение strtotime ('now');

  • 0
    Привет, спасибо за ваш комментарий. Где я могу разместить этот код? в foreach?
  • 0
    Добавьте фрагмент 'foreach ($ row as $ item) {echo "<td>". ($ item! == null? htmlentities ($ item, ENT_QUOTES): "& nbsp;"). "</ td> \ n"; ' с $ filter = array_filter ($ row, function ($ date) use ($ startDate, $ endDate) {return strtotime ($ item)> = strtotime ($ startDate) && strtotime ($ item) <= strtotime ($ endDate)} ); и итерации по $ фильтруемого массива
0

Вам нужно будет использовать функцию strtotime(), чтобы сначала преобразовать дату в unixtimestamp, а затем сравнить ее.

Как показано ниже:

$row = array('30-12-2014','29-12-2014','28-12-2014','27-12-2014','26-12-2014','25-12-2014');
$startDate = '26-12-2014';
$endDate = '28-12-2014';
foreach ($row as $item)
    if ( strtotime($item) >= strtotime($startDate)  &&  strtotime($item) <= strtotime($endDate))
            $newarray[] = $item;

print_r($newarray);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню