Как получить данные с помощью двух столбцов даты в PostgreSQL SQL? - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь получить данные, используя столбец с двумя датами в PostgreSQL. Это дает мне правильный вывод в соответствии с запросом. Но это не дает мне ожидаемого результата. enter image description here

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

 SELECT Sum(pd.line_total) AS lc_receive, 
       rbo.rbo_name, 
       pipay.status, 
       rbo.rbo_id, 
       pipay.document_submission_date, 
       pipay.received_date 
FROM   proforma_invoice pi 
       JOIN pi_payment_information pipay 
         ON pi.proforma_invoice_id = pipay.pi_id 
       JOIN proforma_invoice_details pd 
         ON pd.proforma_invoice_id = pi.proforma_invoice_id 
       JOIN product_category pc 
         ON pc.product_category_id = pd.product_category_id 
       JOIN rbo 
         ON pc.rbo_id = rbo.rbo_id 
       JOIN users usr 
         ON pi.created_by = usr.user_id 
       JOIN team_mapping tm 
         ON usr.employee_id = tm.emp_id 
WHERE  tm.team_id = '5' 
       AND ( pipay.status = 'L/C Received' 
              OR pipay.status = 'TT Received' 
              OR pipay.status = 'Bill Received' 
              OR pipay.status = 'FDD Received' 
              OR pipay.status = 'Doc Submitted' 
              OR pipay.status = 'Acceptance Received' ) 
       AND ( To_date(pipay.received_date, 'DD/MM/YYYY') BETWEEN 
                   To_date('01/02/2020', 'DD/MM/YYYY') AND 
                   To_date('29/02/2020', 'DD/MM/YYYY') 
              OR ( To_date(pipay.document_submission_date, 'DD/MM/YYYY') BETWEEN 
                   To_date( 
                       '01/02/2020', 'DD/MM/YYYY') AND 
                   To_date('29/02/2020', 'DD/MM/YYYY') 
                 ) ) 
       AND pipay.received_date != 'N/A' 
GROUP  BY rbo.rbo_id, 
          rbo.rbo_name, 
          pipay.status, 
          pipay.document_submission_date, 
          pipay.received_date 

Я пытался решить эту проблему со вчерашнего дня, но я не мог найти решение этой проблемы. Мне будет очень полезно, если кто-нибудь поможет мне решить эту проблему. Если кто-нибудь поможет решить эту проблему с помощью Linq Query, это тоже будет полезно.

1 Ответ

3 голосов
/ 02 мая 2020

Кажется, это работает как ожидалось. Рассмотрите эти условия в вашем предложении WHERE:

AND ( 
    To_date(pipay.received_date, 'DD/MM/YYYY') BETWEEN 
                   To_date('01/02/2020', 'DD/MM/YYYY') AND 
                   To_date('29/02/2020', 'DD/MM/YYYY') 
    OR ( To_date(pipay.document_submission_date, 'DD/MM/YYYY') BETWEEN 
                   To_date('01/02/2020', 'DD/MM/YYYY') AND 
                   To_date('29/02/2020', 'DD/MM/YYYY') 
    )
) 

. Это предикаты фильтров в строках, в которых received_date или document_submission_date относятся к февральскому месяцу. То, что вы показываете в своих текущих результатах, удовлетворяет этим условиям.

Если вы хотите, чтобы оба столбца были в феврале, используйте AND вместо OR. Я также рекомендовал бы использовать литералы даты и полуоткрытые интервалы, поскольку они делают запрос короче и легче для чтения:

AND to_date(pipay.received_date,            'DD/MM/YYYY') >= date '2020-02-01'
AND to_date(pipay.received_date,            'DD/MM/YYYY') <  date '2020-03-01'
AND to_date(pipay.document_submission_date, 'DD/MM/YYYY') >= date '2020-02-01'
AND to_date(pipay.document_submission_date, 'DD/MM/YYYY') <  date '2020-03-01'

Примечание: вам следует действительно исправить схему и сохранить дату значения в виде date типов данных. Хранение дат в виде строк - плохая практика, которая делает вещи неэффективными и излишне сложными.


Если вы хотите все null s в document_submission_date, тогда:

AND to_date(pipay.received_date,            'DD/MM/YYYY') >= date '2020-02-01'
AND to_date(pipay.received_date,            'DD/MM/YYYY') <  date '2020-03-01'
AND (
    pipay.document_submission_date IS NULL
    OR (
        to_date(pipay.document_submission_date, 'DD/MM/YYYY') >= date '2020-02-01'
        AND to_date(pipay.document_submission_date, 'DD/MM/YYYY') <  date '2020-03-01'
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...