Попытка преобразовать дату и время в дату в oracle - PullRequest
0 голосов
/ 05 мая 2020

Привет, я пытаюсь преобразовать дату 01-03-2020 10:48:27, полученную из запроса

 SELECT
  LAST_DAY( ADD_MONTHS(SYSDATE,-3 ) )+1
FROM
  dual;

, в '01 -Mar-2020 ', но не могу выполнить много попыток например.

trunc(SELECT  LAST_DAY( ADD_MONTHS(SYSDATE , - 3 ) )+1 FROM  dual),'YEAR')

и

SELECT TRUNC(TO_DATE('SELECT  LAST_DAY( ADD_MONTHS(SYSDATE , - 3 ) )+1 FROM  dual','DD-MON-YY'), 'YEAR')  "New Year" FROM DUAL;

, но возникает ошибка Любая идея приветствуется

Ответы [ 2 ]

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

Вы слишком усложняете ситуацию. Oracle TRUN C принимает дополнительный параметр для указания любого временного интервала для усечения:

SELECT TRUNC(some_date_here, 'MON') FROM dual

Если вы укажете some_date_here как sysdate, то в настоящее время он вернет 01-May-2020 до следующего месяца, когда он начинает возвращать 01-июн-2020

Вы можете обрезать до любого интервала; TRUN C 01.01.2000 12:34:56 с 'MI' вернет 01.01.2000 12:34:00. По умолчанию используется усечение до DD (сокращение времени). При усечении до ДНЯ дата возвращается к дню, с которого началась неделя в стране oracle думает, что это (вероятно, воскресенье или понедельник)

Дополнительная информация: https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions230.htm#i1002084

Насколько я понял, ваша проблема должна быть go с текущей даты до первого числа месяца, которое было между 2 и <3 месяцами go (так что, если сейчас май, вы хотите go назад с первого марта до июня, когда вы хотите go вернуться к первому апреля) </p>

Если вы, следовательно, в текущую дату 5 мая захотите go вернуться к 1 марта, отсчитайте 2 месяца от текущей даты, а затем TRUN C до начала месяца:

SELECT TRUNC(ADD_MONTHS(sysdate, -2), 'MON') FROM dual

Не забудьте, что вы можете TRUN C до ближайшей четверти год, поэтому, если вы составляете отчет за «текущий квартал», то рассмотрение варианта TRUN C (sysdate, 'Q') будет способом go

Наконец , Я бы настоятельно просил вас НЕ использовать oracle для преобразования ваших дат в строки (в большинстве случаев) - если вы сохраните его как дату, все t Путь, пока он не попадет на компьютер пользователя, его можно отформатировать в соответствии с его региональными предпочтениями. Если вы примете решение в отношении формата выходящего дБ, это значительно усложнит предоставление хорошего международного опыта для вашего приложения

1 голос
/ 05 мая 2020

«Конвертировать» в вашем случае означает TO_CHAR; alter session здесь, чтобы установить формат по умолчанию для этого сеанса.

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> select
  2            last_Day(add_months(sysdate, -3)) + 1 orig,
  3    to_char(last_day(add_months(sysdate, -3)) + 1, 'dd-Mon-yyyy', 'nls_Date_language = english') result
  4  from dual;

ORIG                RESULT
------------------- --------------------
01.03.2020 07:25:44 01-Mar-2020

SQL>

Или, если вы изменили сеанс, вы получите его как

SQL> alter session set nls_date_language = 'english';

Session altered.

SQL> alter session set nls_date_format = 'dd-Mon-yyyy';

Session altered.

SQL> select
  2            last_Day(add_months(sysdate, -3)) + 1 orig
  3  from dual;

ORIG
-----------
01-Mar-2020

SQL>

Но, да - обычно мы TO_CHAR это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...