Sql 正确使用日期和时间戳Oracle数据类型
发现很难在脚本中格式化日期和时间戳Sql 正确使用日期和时间戳Oracle数据类型,sql,oracle,plsql,sql-timestamp,Sql,Oracle,Plsql,Sql Timestamp,发现很难在脚本中格式化日期和时间戳 v_date1 Date; v_date2 timestamp; 假设我创建了一个_日期字段,其值为“31-03-2017 18:02:05” select c1 into v_date1 from table_a; 给我——‘2017年3月31日’ 给我-'31-03-2017 06:02:05 PM' 我试图通过游标获取数据,从而对其进行迭代以进行少量验证 如何确保VXDATE2只考虑日期和时间? 请提供帮助。日期数据类型将存储日期和时间戳。然而,时间
v_date1 Date;
v_date2 timestamp;
假设我创建了一个_日期字段,其值为“31-03-2017 18:02:05”
select c1 into v_date1 from table_a;
给我——‘2017年3月31日’
给我-'31-03-2017 06:02:05 PM'
我试图通过游标获取数据,从而对其进行迭代以进行少量验证
如何确保VXDATE2只考虑日期和时间?
请提供帮助。
日期
数据类型将存储日期和时间戳。然而,时间戳数据类型也将存储几秒钟
您没有看到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';
仅当代码中的秒数很重要时,才使用时间戳。日期将用于任何其他用途 我想你误解了日期和时间戳
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”替换为其他值,如“yyyy”,或将“mm”替换为月份的第一天
或舍入而不是删除(同样,可选值和日期为默认值)
然而,所有这些函数仍然返回数据/时间戳值,因此它们仍然包含时间信息——它只是被操纵的
如果您只需要一个字符串,其中包含您需要使用的日期
select to_char(systimestamp, 'dd-mm-yyyy') from dual;
select to_char(sysdate, 'dd-mm-yyyy') from dual;
使用您喜欢的日期格式。要了解这种差异,您需要首先了解会话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;
通常,时间戳存储的信息与日期类型和七个分数相同。若您在db客户机中设置了差异,那个么它只是格式化。
select to_char(systimestamp, 'dd-mm-yyyy') from dual;
select to_char(sysdate, 'dd-mm-yyyy') from dual;
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;