Есть ли какой-нибудь способ установить шаблон даты и принудительно установить определенный день?

#sql #oracle

#sql #Oracle

Вопрос:

У меня сложный select с большим количеством внутренних операторов case в case в case, чтобы попытаться определить правильную дату, но после того, как все выяснено, ему нужно использовать только первый день месяца.

Например, я мог бы получить 08/10/2018 , но я хочу, чтобы мой конечный результат был 08/01/2018 .

Возможно ли сделать что-то вроде приведенного ниже (очевидно, не работает, но ищу предложения).

 SELECT TO_CHAR(sysdate,'MM/01/YYYY') FROM DUAL;
  

В этом случае sysdate будет заменен большим списком операторов case и вычислений. Единственный способ, который я вижу, это сделать

  TO_CHAR(huge_calculations,'MM')||'01'||TO_CHAR(huge_calculations_again,'YYYY')
  

Ответ №1:

Вот несколько выражений, которые возвращают первый день месяца для заданной даты:

Просто:

 SELECT TRUNC(sysdate, 'MM') FROM DUAL;
  

Или:

 SELECT TRUNC(sysdate) - TO_NUMBER(TO_CHAR(sysdate,'DD'))   1 FROM dual
  

Или с помощью LAST_DAY :

 SELECT ADD_MONTHS((LAST_DAY(sysdate) 1),-1) FROM DUAL;
  

Демонстрация на скрипке DB

Комментарии:

1. Спасибо! Я только что нашел другую ссылку, которая использует trunc(sysdate, ‘MM’), которая также дает правильные результаты community.oracle.com/thread/1060750?start=0amp;tstart=0

2. @Slyvr: да, это, вероятно, самое простое из возможных решений, а также более эффективное…