我正在嘗試在不使用任何格式化功能的情況下插入零小時20 分鐘的日期,但出現如下錯誤
insert into employee(created_date) values('4/Jan/21 00:20:00 AM');
ORA-01849: 小時必須在 1 到 12 之間
如何在不使用任何格式化功能的情況下在 oracle 19c中插入零小時
uj5u.com熱心網友回復:
不使用任何格式化功能
那將是一個非常糟糕的主意。這意味著您將要在資料型別列中插入一個字串,DATE希望 Oracle 能夠“識別”該字串,將其隱式轉換為有效的DATE資料型別值并將其插入到列中。有太多的“假設”可能會出錯,而且遲早會出錯。
樣品表:
SQL> create table test (id number, datum date);
Table created.
這是您的查詢:
SQL> insert into test (id, datum) values (1, '4/Jan/21 00:20:00 AM');
insert into test (id, datum) values (1, '4/Jan/21 00:20:00 AM')
*
ERROR at line 1:
ORA-01858: a non-numeric character was found where a numeric was expected
我將to_date使用適當的格式模型來申請它(是的,我知道,你不希望這樣 - 看看會發生什么):
SQL> insert into test (id, datum) values (1, to_date('4/Jan/21 00:20:00 AM', 'dd/Mon/yy hh:mi:ss am'));
insert into test (id, datum) values (1, to_date('4/Jan/21 00:20:00 AM', 'dd/Mon/yy hh:mi:ss am'))
*
ERROR at line 1:
ORA-01843: not a valid month
為什么“一月”不是有效月份?好吧,事實并非如此。在克羅地亞(這是我的資料庫使用的語言),它是“Sij”。但是好的,我可以添加額外的引數TO_DATE:
SQL> insert into test (id, datum) values (1, to_date('4/Jan/21 00:20:00 AM', 'dd/Mon/yy hh:mi:ss am', 'nls_date_language = english'));
insert into test (id, datum) values (1, to_date('4/Jan/21 00:20:00 AM', 'dd/Mon/yy hh:mi:ss am', 'nls_date_language = english'))
*
ERROR at line 1:
ORA-01849: hour must be between 1 and 12
正如 Zakaria 評論的那樣,00是一個無效值;將其更改為12:
SQL> insert into test (id, datum) values (1, to_date('4/Jan/21 12:20:00 AM', 'dd/Mon/yy hh:mi:ss am', 'nls_date_language = english'));
1 row created.
不是它成功了。我插入了什么?對,那是午夜過后 20 分鐘。
SQL> select id, to_date(datum, 'dd.mm.yyyy hh24:mi:ss') datum from test;
ID DATUM
---------- -------------------
1 04.01.2021 00:20:00
SQL>
如果您堅持您的要求,請確保 Oracle 理解它。
SQL> rollback;
Rollback complete.
SQL> alter session set nls_date_language = 'english';
Session altered.
SQL> alter session set nls_date_format = 'dd/mon/yy hh:mi:ss am';
Session altered.
SQL> insert into test (id, datum) values (1, '4/Jan/21 12:20:00 AM');
1 row created.
SQL> select * From test;
ID DATUM
---------- ---------------------
1 04/jan/21 12:20:00 AM
SQL>
如果我是你,我不會這樣做。
uj5u.com熱心網友回復:
ADATE是二進制資料型別,由7個位元組組成(世紀、世紀、月、日、時、分、秒);它始終包含這些組件,并且從不以任何特定格式存盤。
如果要存盤資料和時間,則可以使用:
一個
DATE字面量和一個INTERVAL DAY TO SECOND字面量:INSERT INTO employee(created_date) VALUES ( DATE '2021-01-04' INTERVAL '00:20:00' HOUR TO SECOND);這需要 ISO 8601 格式的日期和 24 小時制的時間。
文字(將
TIMESTAMP被隱式轉換為 aDATE):INSERT INTO employee(created_date) VALUES ( TIMESTAMP '2021-01-04 00:20:00');這需要 ISO 8601 格式的日期和時間(在日期和時間組件之間用空格代替
T)以及 24 小時制的時間。從字串到日期的顯式轉換:
INSERT INTO employee(created_date) VALUES ( TO_DATE( '4/Jan/21 12:20:00 AM', 'DD/Mon/RR HH12:MI:SS AM', 'NLS_DATE_LANGUAGE=English' ) );您可以明確設定您希望使用的格式和語言。(注意:在你想要的 12 小時制中,
12而不是00小時。)從字串到日期的隱式轉換:
首先,設定用于隱式字串到日期(或日期到字串)轉換的格式模型:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD/Mon/RR HH12:MI:SS AM';然后:
INSERT INTO employee(created_date) VALUES ('4/Jan/21 12:20:00 AM');一些非標準的東西,比如直接創建二進制
DATE值:CREATE FUNCTION createDate( year int, month int, day int, hour int, minute int, second int ) RETURN DATE DETERMINISTIC IS hex CHAR(14); d DATE; BEGIN hex := TO_CHAR( FLOOR( year / 100 ) 100, 'fm0X' ) || TO_CHAR( MOD( year, 100 ) 100, 'fm0X' ) || TO_CHAR( month, 'fm0X' ) || TO_CHAR( day, 'fm0X' ) || TO_CHAR( hour 1, 'fm0X' ) || TO_CHAR( minute 1, 'fm0X' ) || TO_CHAR( second 1, 'fm0X' ); DBMS_OUTPUT.PUT_LINE( hex ); DBMS_STATS.CONVERT_RAW_VALUE( HEXTORAW( hex ), d ); RETURN d; END; /然后:
INSERT INTO employee(created_date) VALUES (createDate(2021,1,4,0,20,0));
選項 1、2 和 3 是創建日期的標準方法。
選項 4 是不好的做法(因為任何用戶都可以隨時更改他們自己的會話引數,因此如果它們NLS_DATE_FORMAT從您的預期格式更改,查詢將失敗)但如果您可以保證NLS_DATE_FORMAT不會更改,則可以使用。
Option 5 is only really useful for creating malformed or erroneous dates for testing purposes since it bypasses the normal error checking process.
how to insert zero hour in oracle 19c without using any formatting function
The only one of those options that uses a formatting function is Option 3. However, options 1, 2 and 5 involve formatting the date differently to your format and option 4 requires you to set the implicit format model in a separate statement.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/443323.html
