Правильное использование типов данных даты и метки времени Oracle
Мне трудно отформатировать дату и метку времени в моем скрипте.
v_date1 Date;
v_date2 timestamp;
Предположим, у меня есть поле create_date со значением '31-03-2017 18:02:05'
select c1 into v_date1 from table_a;
Дает мне - '31-03-2017'
select c1 into v_date2 from table_a;
Дает мне - '31 -03-2017 6:02:05 вечера'
Я пытаюсь извлечь данные через курсор и тем самым повторить его для нескольких проверки.
Как убедиться, что v_date2 будет учитывать только дату и время?
Пожалуйста помоги.
3 ответа
Чтобы понять это различие, вы должны сначала понять, как работают настройки nls сессии.
SQL> @C:\Users\44011713\Desktop\so_test.sql
SQL> SET SQLBL ON;
SQL> SET ECHO ON;
SQL> SET FEEDBACK ON;
SQL>
SQL>
SQL> --To understand this differenence you need to first understand how session nls settings work.
SQL>
SQL> SELECT * FROM nls_session_parameters
2 where parameter = 'NLS_DATE_FORMAT';
PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_DATE_FORMAT
MM/DD/YYYY
1 row selected.
SQL>
SQL>
SQL> SELECT CURRENT_DATE FROM DUAL;
CURRENT_DA
----------
03/22/2017
1 row selected.
SQL> -- Since we are fetcing date value and the session format mask is MM/DD/YYYY so the output --will be aligning to this format only
SQL>
SQL> SELECT * FROM nls_session_parameters
2 where parameter = 'NLS_TIMESTAMP_FORMAT';
PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_TIMESTAMP_FORMAT
MM/DD/YYYY HH24:MI:SS.FF6
1 row selected.
SQL>
SQL>
SQL> ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'MM/DD/YYYY HH24:MI:SS.FF6';
Session altered.
SQL>
SQL> SELECT LOCALTIMESTAMP FROM DUAL;
LOCALTIMESTAMP
---------------------------------------------------------------------------
03/22/2017 09:53:54.133795
1 row selected.
SQL> -- Since we are fetcing date value and the session format mask is MM/DD/YYYY --HH24:MI:SS.FF6 so the output will be aligning to this format only
SQL>
SQL> --Now lets tweak some settings :P
SQL>
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'MM/DD/YYYY HH24:MI:SS';
Session altered.
SQL>
SQL> SELECT CURRENT_DATE FROM DUAL;
CURRENT_DATE
-------------------
03/22/2017 09:53:54
1 row selected.
SQL> -- And now the format aligns to the forced the setting done by ALTER SESSION.
SQL>
SQL> -- So above example illustrates how the the format ca be changed for session
SQL>
SQL> --Hope this helps.
SQL> spool off;
Я думаю, что вы неправильно поняли дату и время
select c1 into v_date1 from table_a;
Дает вам объект даты
v_date2 timestamp;
Дает вам объект отметки времени
Оба эти объекта содержат компоненты даты и времени. Временная метка также содержит более подробную информацию (доли секунды).
Если вы хотите только дату, вы можете использовать ряд встроенных функций...
Для полной информации...
select systimestamp from dual;
select sysdate from dual;
но имейте в виду, что ваша среда запросов может не отображать полную информацию о дате в зависимости от ее настроек.
Чтобы удалить компонент времени...
select trunc(systimestamp) from dual;
select trunc(sysdate) from dual;
или для большего контроля
select trunc(systimestamp, 'dd') from dual;
select trunc(sysdate, 'dd') from dual;
где "dd" можно заменить другими значениями, такими как "гггг", если вы хотите получить первый день года или "мм" для первого дня месяца.
или округление, а не удаление (снова с дополнительными значениями и днем по умолчанию)
select round(systimestamp, 'dd') from dual;
select round(sysdate, 'dd') from dual;
Однако все эти функции по-прежнему возвращают данные / метки времени, поэтому они все еще содержат информацию о времени - им просто манипулируют.
Если все, что вам нужно, это строка со днем, когда вам нужно использовать to_char
select to_char(systimestamp, 'dd-mm-yyyy') from dual;
select to_char(sysdate, 'dd-mm-yyyy') from dual;
используя любой формат даты, который вы предпочитаете.
DATE
Тип данных будет хранить дату вместе с отметкой времени. Тип данных временной метки, однако, также будет хранить доли секунды.
Причина, по которой вы не видите время для DATE
Тип данных из-за ваших настроек NLS. Измените их ниже
ALTER SESSION SET nls_date_format='DD-MM-YYYY HH24:MI:SS';
ALTER SESSION SET NLS_TIMESTAMP_FORMAT='DD-MM-RR HH24.MI.SSXFF';
использование timestamp
только если доля доли имеет значение в вашем коде. ДАТА будет работать для любого другого использования.