मैं MySQL, Pdo, Apache, InnoDB, php 5.4.16 का उपयोग कर रहा हूं। मुझे ईवेंट प्रदर्शित करने की आवश्यकता है> = CURDATE ()। ईवेंट की अवधि 1 दिन (tipo_id=1) या अधिक (tipo_id=4) हो सकती है। प्रत्येक ईवेंट की एक तिथि होती है जिसे मैंने प्रारंभ तिथि के रूप में data_evento कॉलम में संग्रहीत किया था। एक दिन से अधिक की अवधि वाले ईवेंट के लिए मैं एक fine_data_evento कॉलम का उपयोग करता हूं जहां मैंने अंतिम तिथि संग्रहीत की है। क्योंकि सभी ईवेंट की समाप्ति तिथि नहीं होती है, मैंने fine_data_evento को NULL के रूप में सेट किया है। इसलिए मुझे आज से शुरू होने वाले हर प्रकार के आयोजन को एकल तिथि या "से-टू" तिथि की सीमा के साथ प्रदर्शित करने में कोई समस्या नहीं है। उदाहरण के लिए:

Title:Event 01
Date: 12 September 2019
========================
Title:Event 02
Date: From 12/09/2019 to 10/10/2019
========================
Title:Event 03
Date: 13 September 2019

समस्या तब होती है जब मैं Event 02 के एक दिन बाद (13/09) इसकी आरंभिक तिथि (उदाहरण में 12/09) प्रदर्शित करने का प्रयास करता हूं, क्योंकि SQL स्थिति data_evento>=CURDATE() है।

तो सवाल यह है कि आज से पहले शुरू होने वाली और कुछ दिनों बाद समाप्त होने वाली घटनाओं को प्रदर्शित करना कैसे जारी रखा जाए, जहां अन्य सभी कार्यक्रम आज से शुरू होते हैं?

शायद मुझे कुछ चाहिए अगर SQL में? मैंने अन्य पोस्ट लाल कर दीं लेकिन मुझे कोई जवाब नहीं मिला। इसलिए मुझे समझ नहीं आ रहा है कि अच्छा काम करने का कौन सा तरीका है। मुझे पता है कि यह आसान है लेकिन मैं नहीं कर सकता। धन्यवाद।

निम्नलिखित पर मेरे पास कुछ कोड है।

Tutti_eventi.php

....
$sql = 'SELECT `id_evento`,`titolo_evento`, `desc_evento`,`data_evento`,`fine_data_evento`, `nome_image`, `nome_categoria`,`comune_nome`,`nome_provincia`,`tipo_id` FROM `eventi`, `images`,`categoria`,`comuni`,`provincia`
              WHERE
              `id_image`=`id_img`
              AND
              `id_categoria`=`cat_id`
              AND
              `id_comune`=`com_id`
              AND
              `id_provincia`=`id_prov`
              AND
              `tipo_id` in (1,4)
              AND
              `data_evento` >= CURDATE()
              ORDER BY
              `data_evento` ASC';
 ....

Tutti_eventi.html.php

 ....
 while ($evento = $eventi->fetch(PDO::FETCH_ASSOC)) {
                            ....
                            <div class="col-sm-12 col-md-12" style="padding-top:5px;">

                              <?php

                              if (isset($evento['fine_data_evento'])) {

                                $tipo=$evento['tipo_id'];

                                if ($tipo = 4) {

                                echo '<p><span class="glyphicon glyphicon-calendar" aria-hidden="true"></span>
                                          <span class="glyphicon-class">';

                                            echo '<span>Dal ';
                                              Setlocale(LC_ALL, 'it_IT');
                                              $date3= new DateTime($evento['data_evento']);
                                              echo $date3->format('d/m/Y');
                                            echo '</span>';
                                            echo '<span> al ';
                                              Setlocale(LC_ALL, 'it_IT');
                                              $date4= new DateTime($evento['fine_data_evento']);
                                              echo $date4->format('d/m/Y');
                                            echo '</span>';

                                          echo '</span></p>';
                                        }


                                } else {

                                  echo '<p><span class="glyphicon glyphicon-calendar" aria-hidden="true"></span>
                                            <span class="glyphicon-class">';

                                              echo '<span>';
                                                Setlocale(LC_ALL, 'it_IT');
                                                $date= new DateTime($evento['data_evento']);
                                                echo $date->format('l');
                                              echo '</span><br>';
                                              echo '<span>';
                                                Setlocale(LC_ALL, 'it_IT');
                                                $date1= new DateTime($evento['data_evento']);
                                                echo $date1->format('d F Y');
                                              echo '</span>';
                                            echo '</span><br>';

                                              echo '<span class="glyphicon glyphicon-time" aria-hidden="true"></span>
                                                    <span class="glyphicon-class">';
                                                        $date2= new DateTime($evento['data_evento']);
                                                        echo $date2->format('H'.':'.'i');

                                                    echo '</span></p>';

                                }

                                echo '</div>';

                              echo '<div class="col-sm-12 col-md-12">'.$evento['desc_evento'].'</div>';

                      echo '</div>';

                  }
                            ?>

विशेष रूप से @GMB के लिए धन्यवाद, मैं समाधान के बहुत करीब हूं। मैंने अपनी SQL क्वेरी में COALESCE(fine_data_evento, data_evento) >= CURDATE() जोड़ा। लेकिन मुझे ORDER BY ASC की जरूरत है। जब मैं DESC का उपयोग करता हूं तो यह ठीक काम करता है: Event 2 प्रदर्शित होता है और पृष्ठ के शीर्ष पर अंतिम तिथि से शुरू होने वाले ईवेंट प्रदर्शित होते हैं, जबकि Event 2 सबसे नीचे होता है। जब मैं इसके बजाय ASC का उपयोग करता हूं Event 2 प्रदर्शित नहीं हो सकता है और शीर्ष पर आज से शुरू होने वाली घटनाओं को सही ढंग से प्रदर्शित किया जाता है। नई क्वेरी पर देखें:

    $sql = 'SELECT `id_evento`, `titolo_evento`, `desc_evento`, `data_evento`, `fine_data_evento`, `nome_image`, `nome_categoria`, `comune_nome`, `nome_provincia`, `tipo_id` FROM `eventi`,  `images`, `categoria`, `comuni`, `provincia`
                  WHERE
                  `id_image`=`id_img`
                  AND
                  `id_categoria`=`cat_id`
                  AND
                  `id_comune`=`com_id`
                  AND
                  `id_provincia`=`id_prov`
                  AND
                  `tipo_id` in (1,4)
                  AND
                  COALESCE(`fine_data_evento`, `data_evento`) >= CURDATE()
                  ORDER BY `data_evento` ASC';

और निम्नलिखित समाधान है। मैं इस पोस्ट पर लाल हूं:

COALESCE को मिलाकर 2 कॉलम कैसे ऑर्डर करें?

समाधान जोड़ना है:

COALESCE(fine_data_evento, data_evento) >= CURDATE() - INTERVAL 1 DAY ORDER BY COALESCE (fine_data_evento) ASC, data_evento ASC

यह काम करता है: Event 2 को पृष्ठ के निचले भाग में रखा जाता है, जब इसकी आरंभ तिथि आज से पहले होती है, जबकि null समाप्ति तिथि वाले ईवेंट को पृष्ठ के शीर्ष पर आज के अनुसार क्रमबद्ध किया जाता है।

सभी को धन्यवाद

0
datone 12 सितंबर 2019, 00:45

1 उत्तर

सबसे बढ़िया उत्तर

यदि मैंने आपका सही ढंग से अनुसरण किया है, तो आप इस शर्त को इस प्रकार बता सकते हैं:

( fine_data_evento IS NULL AND data_evento >= CURDATE() )
OR (fine_data_evento >= CURDATE() AND data_evento <= CURDATE() )

इसका अर्थ है: यदि कोई समाप्ति तिथि नहीं है, तो प्रारंभ तिथि आज से अधिक या बराबर होनी चाहिए। यदि कोई समाप्ति तिथि है, तो वह आज से बड़ी या उसके बराबर होनी चाहिए, जबकि start_date आज से कम या बराबर होनी चाहिए।

DB Fiddle पर डेमो:

निम्नलिखित नमूना डेटा को देखते हुए:

| title   | data_evento | fine_data_evento |
| ------- | ----------- | ---------------- |
| Event 1 | 2019-09-11  |                  |
| Event 2 | 2019-09-10  | 2019-10-10       |
| Event 3 | 2019-09-13  |                  |
| Event 4 | 2019-09-01  |                  |
| Event 5 | 2019-09-01  | 2019-09-10       |
| Event 6 | 2019-10-01  | 2019-10-10       |

वर्तमान तिथि '2019-09-11' है, और क्वेरी वापस आती है:

| title   | data_evento | fine_data_evento |
| ------- | ----------- | ---------------- |
| Event 1 | 2019-09-11  |                  |
| Event 2 | 2019-09-10  | 2019-10-10       |
| Event 3 | 2019-09-13  |                  |
0
GMB 12 सितंबर 2019, 02:06