5урок по oracle sql, дата, время, регулярные выражения
Продолжаем знакомство с возможностями запросов в ORACLE, это пятый урок.
--DBTIMEZONE - зона, установленная в базе данных
--SESSIONTIMEZONE - зона в сессии пользователя
SELECT DBTIMEZONE, SESSIONTIMEZONE FROM dual;
--CURRENT_DATE - текущая дата
--CURRENT_TIMESTAMP - текущая дата + время с зоной
--LOCALTIMESTAMP - текущая дата + время без зоны
SELECT CURRENT_DATE, CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM dual;
--ADD_MONTHS(d, x)
--Возвращает дату, полученную в результате прибавления одного или нескольких месяцев.
--Количество месяцев задается параметром x, который может быть отрицательным.
SELECT ADD_MONTHS (SYSDATE, -5) d FROM dual;
--LAST_DAY(d) - Возвращает последнее число месяца
SELECT LAST_DAY (SYSDATE) d FROM dual;
--Вычислить разницу в сутках
SELECT ROUND(to_date('14.08.2014', 'DD/MM/YYYY' )-SYSDATE,0) AS diff FROM dual;
--Truncate (усечение) даты в Oracle
SELECT TRUNC(SYSDATE) FROM dual; --усечение до минуты:
SELECT TRUNC(SYSDATE,'mi') FROM dual; --усечение до часа:
SELECT TRUNC(SYSDATE,'hh') FROM dual;
--ADD_MONTHS добавляет\отнимает месяцы
--Вычислить дату двухмесячной давности
SELECT ADD_MONTHS(TRUNC(SYSDATE),-2) FROM dual;
--Выборка часов\минут\секунд из даты
SELECT
TO_NUMBER(EXTRACT (HOUR FROM a.dt)) hh,
TO_NUMBER(EXTRACT (MINUTE FROM a.dt)) mm,
TO_NUMBER(EXTRACT (SECOND FROM a.dt)) ss
FROM (SELECT CAST(SYSDATE AS TIMESTAMP) dt FROM dual) a;
INSERT INTO test_regexp VALUES ('abcde');
INSERT INTO test_regexp VALUES ('12345');
INSERT INTO test_regexp VALUES ('1avbn');
INSERT INTO test_regexp VALUES ('1avfk');
INSERT INTO test_regexp VALUES ('123-5');
INSERT INTO test_regexp VALUES ('12.45');
INSERT INTO test_regexp VALUES ('1 3 5');
INSERT INTO test_regexp VALUES ('1 45');
INSERT INTO test_regexp VALUES ('a b c d');
INSERT INTO test_regexp VALUES ('a b c d e');
INSERT INTO test_regexp VALUES ('111.222.3333');
INSERT INTO test_regexp VALUES ('222.333.4444');
INSERT INTO test_regexp VALUES ('333.444.5555');
INSERT INTO test_regexp VALUES ('avfk');
--REGEXP_COUNT определяет кол во вхождений REGEXP шаблона в строку
--REGEXP_COUNT(<source_string>, <pattern>[[, <start_position>], [<match_parameter>]])
--В данном примере <start_position> необязательный параметр
SELECT REGEXP_COUNT(val, 'av', 2) RES FROM test_regexp;
SELECT REGEXP_COUNT(val, 'av', 1) RES FROM test_regexp;
--REGEXP_INSTR определяет номер первого символа вхождения REGEXP шаблона в строку
--REGEXP_INSTR(<source_string>, <pattern>[[, <start_position>][, <occurrence>][, <return_option>][, <match_parameter>][, <sub_expression>]])
SELECT REGEXP_INSTR(val, '333', 1) RES FROM test_regexp;
--REGEXP_LIKE выбирает строки, соответвующие шаболну регулярного выражения
--REGEXP_LIKE(<source_string>, <pattern>, <match_parameter>)
SELECT * FROM test_regexp WHERE REGEXP_LIKE(val, '333');
--REGEXP_REPLACE заменяет шаблон регулярного выражения в строке на заданное значение
--REGEXP_REPLACE(<source_string>, <pattern>,<replace_string>, <position>, <occurrence>, <match_parameter>)
SELECT REGEXP_REPLACE(val, ' ', '') RES FROM test_regexp;
--REGEXP_INSTR определяет номер первого символа вхождения шаблона в строке
--REGEXP_INSTR(<source_string>, <pattern>[[, <start_position>][, <occurrence>][, <return_option>][, <match_parameter>][, <sub_expression>]])
SELECT REGEXP_INSTR(val, '5') RES FROM test_regexp;
--REGEXP_SUBSTR выделяет из строки заданный шаблон
--REGEXP_SUBSTR(source_string, pattern[, position [, occurrence[, match_parameter]]])
SELECT REGEXP_SUBSTR(val, '1av') RES FROM test_regexp;
Шаблоны регулярных выражений на википедии https://ru.wikipedia.org/wiki/%D0%E5%E3%F3%EB%FF%F0%ED%FB%E5_%E2%FB%F0%E0%E6%E5%ED%E8%FF --Пара примеров использования регулярных выражений
--Начало строки с 1 или 2
SELECT * FROM test_regexp WHERE REGEXP_LIKE(val, '[1-2]'); --Конец строки на 5
SELECT * FROM test_regexp WHERE REGEXP_LIKE(val, '[$5]'); --С повторением символа два раза (в данном примере на символе "пробел")
SELECT * FROM test_regexp WHERE REGEXP_LIKE(val, '1 {2}');