Как отформатировать дату где?

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

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.


person Carlo Angeles    schedule 03.03.2020    source источник
comment
какую базу данных вы используете?   -  person Manjuboyz    schedule 03.03.2020
comment
SQL-скрипт в SAP Hana   -  person Carlo Angeles    schedule 03.03.2020
comment
Отвечает ли это на ваш вопрос? Как отформатировать дату в хане   -  person TOH19    schedule 03.03.2020
comment
@CarloAngeles Проясните, что вы спросили ... я думаю, у вас проблема с форматированием даты при использовании предложения BETWEEN .. try like Between to_date('01-01-2020','MM-DD-YYYY')   -  person shalini    schedule 03.03.2020
comment
@Shalini Я уже пробовал это, но все равно получаю ошибку.   -  person Carlo Angeles    schedule 03.03.2020
comment
Какое сообщение об ошибке вы получаете? И какой тип данных является столбцом? Это тип данных date или столбец строки VARCHAR, в котором просто хранится дата?   -  person Lars Br.    schedule 03.03.2020
comment
@ Ларс Бр. Ошибка при синтаксическом анализе «01/01/2020» в формате «ММ/ДД/ГГГГ». Я думаю, что не могу изменить значение формата.   -  person Carlo Angeles    schedule 04.03.2020
comment
@LarsBr.Вы пытались изменить формат даты на 'MM/DD/YYYY'   -  person shalini    schedule 05.03.2020


Ответы (3)


Если тип данных столбца равен 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.
Третье преобразование (to_date(a."DocDate")) может показаться неожиданным, но довольно важным.

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

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

p.s. Я только что понял, что критерии выбора даны в формате MM/DD/YYYY, что, вероятно, является причиной ошибки преобразования, которую OP получил ранее.

person Lars Br.    schedule 04.03.2020

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

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

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

  3. В базе данных SAP HANA также существует четыре конкретных типа (Библиотека SAP "Типы данных Datetime"): 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 тип DATE: 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')

person Sandra Rossi    schedule 03.03.2020
comment
Я пробовал решение 3, но, думаю, я не могу этого добиться, потому что DocDate - это TimeStamp. - person Carlo Angeles; 04.03.2020
comment
@CarloAngeles Пожалуйста, отмените мой ответ, поскольку тип DocDate - это TIMESTAMP, и я не отвечаю на этот вопрос. Кроме того, ваше программное обеспечение SAP, похоже, является SAP Business One (вы подтверждаете?), И я тоже не отвечаю на этот случай. - person Sandra Rossi; 04.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');
person sovannarith cheav    schedule 03.03.2020