Как получить дневную часть (в виде строки / символа) из даты и выполнить тесты на ней в PL / SQL? - PullRequest
0 голосов
/ 04 мая 2018

Может кто-нибудь просто сказать мне, почему это не работает. Насколько я знаю, я поместил строку в переменную и хотел ее протестировать, но она не сработала и вызвала ошибки.

SET SERVEROUTPUT ON;

DECLARE
    DATETODAY DATE := SYSDATE;
    DAYT VARCHAR2(10);

BEGIN
   SELECT TO_CHAR(SYSDATE,'DAY') INTO DAYT FROM DUAL;
   DBMS_OUTPUT.PUT_LINE('The date today is '||DATETODAY ||' and it is ' ||DAYT);

   IF DAYT = 'SATURDAY' OR DAYT = 'SUNDAY' THEN
       : DBMS_OUTPUT.PUT_LINE('Today is '||DAYT||' and its is a weekend');
   ELSE
       : DBMS_OUTPUT.PUT_LINE('Today is '||DAYT||' and its a week day');
   END IF;

END;
/

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

TO_DATE( date_value, 'DAY' ) возвращает строку фиксированной длины (не переменной длины); это означает, что он дополняется справа пробелами:

SQL Fiddle

Запрос 1 :

SELECT TO_CHAR( DATE '2018-05-05', 'DAY' ) AS day,
       DUMP( TO_CHAR( DATE '2018-05-05', 'DAY' ) ) As dump
FROM   DUAL

Результаты

|       DAY |                                    DUMP |
|-----------|-----------------------------------------|
| SATURDAY  | Typ=1 Len=9: 83,65,84,85,82,68,65,89,32 |

Показывает, что последний символ имеет код ASCII 32 - пробел.

Итак, ваш код должен быть:

SET SERVEROUTPUT ON;
DECLARE
  DATETODAY DATE := SYSDATE;
  DAYT VARCHAR2(10);
BEGIN
   DAYT := TO_CHAR( DATETODAY ,'DAY');
   DBMS_OUTPUT.PUT_LINE('The date today is '||DATETODAY ||' and it is ' ||DAYT);

   IF DAYT = 'SATURDAY ' OR DAYT = 'SUNDAY   ' THEN
     DBMS_OUTPUT.PUT_LINE('Today is '||DAYT||' and its is a weekend');
   ELSE
     DBMS_OUTPUT.PUT_LINE('Today is '||DAYT||' and its a week day');
   END IF;
END;
/

Какие (для моей NLS_DATE_FORMAT настройки YYYY-MM-DD HH24:MI:SS) выводят:

The date today is 2018-05-04 14:32:25 and it is FRIDAY   
Today is FRIDAY    and its a week day

Изменив начальное назначение на DATETODAY DATE := DATE '2018-05-05';, тогда вывод будет:

The date today is 2018-05-05 00:00:00 and it is SATURDAY 
Today is SATURDAY  and its is a weekend

Однако вы также можете написать это как:

DECLARE
  DATETODAY DATE := SYSDATE;
  DAYT VARCHAR2(10);
BEGIN
   DAYT := TO_CHAR( DATETODAY ,'DAY');
   DBMS_OUTPUT.PUT_LINE('The date today is '||DATETODAY ||' and it is ' ||DAYT);

   IF DATETODAY - TRUNC( DATETODAY, 'IW' ) >= 5 THEN
     DBMS_OUTPUT.PUT_LINE('Today is '||DAYT||' and its is a weekend');
   ELSE
     DBMS_OUTPUT.PUT_LINE('Today is '||DAYT||' and its a week day');
   END IF;
END;
/

Поскольку TRUNC( DATETODAY, 'IW' ) будет обрезать дату до начала недели ISO (всегда полночь в понедельник), это не зависит от настроек NLS_DATE_LANGUAGE или NLS_TERRITORY, которые влияют на функцию TO_CHAR.

0 голосов
/ 04 мая 2018
SELECT TO_CHAR (SYSDATE, 'day') DayName,
       TO_CHAR (SYSDATE, 'd')   DayOfWeek,
       TO_CHAR (SYSDATE, 'dd')  DayOfMonth,
       TO_CHAR (SYSDATE, 'ddd') DayOfYear
  FROM DUAL;

DayName привязан к языку вашего БД. Лучше использовать DayOfWeek. В любом случае вы должны запустить предоставленный пример sql, чтобы сравнить ваши результаты. Возможно, UPPER() также может вам помочь.

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