Как отформатировать дату в где? - PullRequest
1 голос
/ 03 марта 2020

У меня есть этот скрипт:

select * from OPDN A 
where A."DocDate" between '2020/01/01' and '2020/01/31'

Как получить формат «ММ / ДД / ГГГГ» в предложении WHERE?

select * from OPDN A 
where A."DocDate" between '01/01/2020' and '01/31/2020'

Столбец DocDate имеет тип TimeStamp.

Ответы [ 3 ]

3 голосов
/ 04 марта 2020

Если тип данных столбца равен TIMESTAMP, как ОП написала в комментарии к превосходному ответу Сандры Росси, тогда на самом деле требуется три преобразования, чтобы сделать выбор должным образом.

  1. поворот первый параметр выбора (между ...) в дату
  2. превращает второй параметр выбора (между ... и b) в дату
  3. , превращая столбец отметки времени DocDate в дата

Это выглядит так:

select 
        * 
from 
     OPDN A 
where 
    to_date(A."DocDate") between to_date('01/01/2020', 'MM/DD/YYYY')
                             and to_date('01/31/2020', 'MM/DD/YYYY');

Преобразование параметров выбора с помощью строк формата должно быть очевидным, и в результате получается та же информация в SQL тип данных date.
Третье преобразование (to_date(a."DocDate")) может быть неожиданным, но довольно важным.

Способ выбора означал для работы, чтобы включить все от самого начала периода выбора до самого конца. Если входные фильтры просто конвертируются в метки времени, то они будут иметь компонент времени 00:00 (полночь), так как не предоставлено никакой информации о времени суток.
Это приведет ко всем значениям "DocDate" после полночь будет исключено.

Правильный уровень сравнения здесь date , поэтому "DocDate" также необходимо преобразовать в тип данных date без учета часов.

ps I только что понял, что критерии выбора даны в формате MM/DD/YYYY, что, вероятно, является причиной ошибки преобразования ОП, полученной ранее.

2 голосов
/ 03 марта 2020

Это зависит от типа и формата столбца DocDate.

  1. В программном обеспечении SAP ERP (R / 3, E CC, S / 4HANA) исторически даты определялись как типы NVARCHAR из 8 символов в формате «ГГГГММДД».

  2. В SAP Business One я не знаю ...

  3. В базе данных SAP HANA также есть четыре указанных типа c ( Библиотека SAP "Типы данных даты и времени" ): DATE, TIME, SECONDDATE, TIMESTAMP .

Решения для каждого случая:

  1. Если тип DocDate равен NVARCHAR 8 с форматом ГГГГММДД: select * from OPDN A where A."DocDate" between '20200101' and '20200131'

  2. В SAP Business One я не знаю ...

  3. Если тип DocDate равен ДАТА : select * from OPDN A where A."DocDate" between to_date('01/01/2020','DD/MM/YYY') and to_date('01/31/2020', 'DD/MM/YYY')

1 голос
/ 03 марта 2020

В Oracle, это может сделать это

select * from OPDN A 
where to_date(A."DocDate", 'DD/MM/YYY') between to_date('01/01/2020','DD/MM/YYY') and to_date('01/31/2020', 'DD/MM/YYY');
...