Правильное использование типов данных даты и метки времени 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 только если доля доли имеет значение в вашем коде. ДАТА будет работать для любого другого использования.

Другие вопросы по тегам