so I was doing my homework and the table is
Create TABLE Book
(
bookID number(2,0) not null,
title char(50) not null,
catID char(2),
copyrightYear number(2,0),
isbnNumber char(50),
publisherID char(2),
purchasePrice number(4,2),
coverType char(10),
datePurchased date default sysdate,
pages number(4,0)
)
and when I insert the date inside it becomes an error ( not a valid month)
Insert into Book
values (1, 'Dirk Luchte', 'PS', 93, null,'NE', 23.50,'Hard', '23-nov-1993',1012);
and when I try to use to_date statement
Insert into Book
values (1, 'Dirk Luchte', 'PS', 93, null,'NE', 23.50,'Hard', to_date('23-nov-1993','DD-MM-YYYY'),1012);
the whole oracle crashed to blank, what can I do?
You can use official documentation for your homework, it isn't considered cheating (not at least more than asking in Stack Overflow):
Format Models
Element Specify in TO_* datetime functions? Description
MM Yes Month (01-12; January = 01)
So nov is clearly not a number between 1 and 12, thus the error.
And please learn to not disregard the error messages (you didn't even think about sharing it here): they're here to help.
As about the using sysdate in table causing error title, you're confused. The default value of your column is not used: you assign a explicit value. If you want the default value, you have to leave the column out. That also means that you have to provide a column list in your query (which is anyway a good practice because your app will not break when you add new columns).
The easiest way to specify a date literal is using the ISO format:
DATE '1993-12-23'
Related
CREATE TABLE Pizza
(
pizza_id DECIMAL(12) NOT NULL PRIMARY KEY,
name VARCHAR(32) NOT NULL,
date_available DATE NOT NULL,
price DECIMAL(4,2) NOT NULL
);
CREATE TABLE Topping
(
topping_id DECIMAL(12) NOT NULL,
topping_name VARCHAR(64) NOT NULL,
pizza_id DECIMAL(12)
);
ALTER TABLE Topping
ADD CONSTRAINT topping_pk PRIMARY KEY(topping_id);
ALTER TABLE Topping
ADD CONSTRAINT Topping_pizza_fk
FOREIGN KEY(pizza_id) REFERENCES Pizza(pizza_id);
INSERT INTO pizza (pizza_id, name, date_available, price)
VALUES (1, 'Plain', CAST('27-Feb-2021' AS DATE), 6);
Error:
ORA-01858: a non-numeric character was found where a numeric was expected
I cannot figure out which part is wrong, I'm just a beginner for SQL, it seems related with date, can someone help me?
This works for me: SQL Fiddle. Don't use CAST to convert strings to dates. That's the only thing that looks off about your example. It may be using a different default date format than your string. Instead use TO_DATE( '27-Feb-2021', 'DD-Mon-YYYY') which converts a string to a date, or DATE '2021-02-27', which is a date literal and only takes the yyyy-mm-dd format.
Additionally, I'd suggest using NUMBER instead of DECIMAL just because it's more standard in the Oracle world. And always use VARCHAR2 instead of VARCHAR, which is officially discouraged.
I 'm using Oracle Application Express Edition 4.0.2.00.09
While creating the table I'm getting error "ORA-00907: missing right parenthesis", I have checked previously asked question on this however could not make it through.
Create table NewOne (
PersonId Int(10),
Hire_Date varchar(255),
Tenure number(255),
Review varchar(255),
Next_Day varchar(255),
Last_day varchar(255)
)
Make the changes below
Change int to number
Change number(255) to number(38) , as 38 is the max allowed for number
It should work fine.
Check out the db fiddle link - https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=d1fecc3e55708115d2326fdeec34243d
You can't specify a length for the INT subtype, it is what it is. You should use the NUMBER type instead.
Once you fix that you'll find that your tenure column is specified with 255 digits, I don't think that's close to reality and will also error.
You should be using VARCHAR2 not VARCHAR on Oracle.
int is a perfectly acceptable Oracle type. However, int(10) is not. Number itself is limited to a max of 38. And Oracle recommend varchar2() instead of varchar(). So I would recommend:
Create table NewOne (
PersonId Int,
Hire_Date varchar2(255),
Tenure number,
Review varchar2(255),
Next_Day varchar2(255),
Last_day varchar2(255)
);
Here is a db<>fiddle
I want to save the date in format 'dd.mm.yyyy'. So I read there are different formats for a date in SQL (by the way I use Visual Studio and SQL Server).
I tried this code:
CREATE TABLE APP(
ID INT NOT NULL,
DT DATE FORMAT 'dd.mm.yyyy',
ADDRESS NVARCHAR (100) ,
PRIMARY KEY (ID)
);
But it returns the error:
Incorrect syntax near 'FORMAT'.
After that I want to use this code:
INSERT INTO APP (ID, DT)
VALUES ('1','22.12.2016')
You don't need to specify the format in the table definition as dates are stored in a binary format.
CREATE TABLE APP(
ID INT NOT NULL,
DT DATE,
ADDRESS NVARCHAR (100) ,
PRIMARY KEY (ID)
);
When you try to insert into that table however, the server will try to convert the string to a date before inserting it. This can be problematic as it is unable to tell if 12.11.2017 is the 12th of November or 11th of December. To figure this out it uses the localization settings of the user account that is performing the operation.
Often you will find that the account that is running the operation is set to USA format, month day then year (MDY), when what you want is day month year (DMY) format. One way to tell it what the sequence of the date's parts is to use the DATEFORMAT setting like this:
SET DATEFORMAT dmy;
INSERT INTO APP (ID, DT)
VALUES (1,'22.12.2016')
Another alternative is to cast the string to a date using the CONVERT function and tell it what the date format is. The formats have numeric codes like 104 for German format Like this:
INSERT INTO APP (ID, DT)
VALUES (2,CONVERT(date,'22.12.2016',104))
Dates are stored in an internal format. Formats only make sense for input and output.
In your case you want the date in a German format (104), so you can use:
select convert(varchar(255), dt, 104)
If you like, you can include the formatted date as a separate column:
CREATE TABLE APP (
ID INT NOT NULL,
DT DATE,
ADDRESS NVARCHAR(100),
DT_FORMATTED AS (convert(varchar(255), dt, 104)),
PRIMARY KEY (ID)
);
You can then refer to dt_formatted to get the string in the format you want.
Use this:
CREATE TABLE APP(
ID INT NOT NULL,
DT DATE ,
ADDRESS NVARCHAR (100) ,
PRIMARY KEY (ID)
);
Its default setting is yyyy-MM-dd.
No, it's not. There is no formatting information at all associated with the field.
The value is not formatted by the database. It's returned only as a point in time. Formatting that value into its textual representation is done by the application that is getting the data from the database.
So, there is nothing that you can do in the database to change how the date value is formatted. You have to change that where the data is displayed.
Dates are stored in an internal format.
Formats only make sense for input and output.
You can include the formatted date as a separate column:
SQL Server supports the date format. You have to use the below date format.
With century (yyyy) | Standard | Input/Output
103 | British/French | 103 = dd/mm/yyyy
CREATE TABLE [dbo].[Post]
(
[Id] INT IDENTITY (1, 1) NOT NULL,
[Name] VARCHAR(MAX) NULL,
[RowNo] INT NULL,
[ColNo] INT NULL,
[Deadline] (CONVERT(VARCHAR(255), dt, 103)), -- Include the formatted date as a separate column
CONSTRAINT [PK_KtoCo]
PRIMARY KEY CLUSTERED ([Id] ASC)
);
Use this.
CREATE TABLE:
CREATE TABLE EMP
(EID NUMBER(20),
ENAME VARCHAR2(20),
DT DATE,
SAL NUMBER(20));
INSERT INTO THE TABLE:
INSERT INTO EMP (EID,ENAME,DT,SAL) VALUES(01,'ABCDE','11.NOV.2011',10000);
O/P OF ABOVE TABLE:
SELECT * FROM EMP;
EID ENAME DT SAL
01 ABCDE 11-DEC-11 10000
Getting this error while trying to put a few inserts into a table.
Getting an error regarding not a valid month and when I try change it around i'm getting invalid number error.
ORA-01843: not a valid month ORA-06512: at "SYS.DBMS_SQL"
Code:
CREATE TABLE ExpenseReport (
ERNo NUMERIC(10) NOT NULL,
ERDesc VARCHAR(255) NOT NULL,
ERSubmitDate DATE DEFAULT CURRENT_TIMESTAMP,
ERStatusDate DATE NOT NULL,
ERStatus VARCHAR(8) DEFAULT 'PENDING',
SubmitUserNo NUMERIC(10) NOT NULL,
ApprUserNo NUMERIC(10) NOT NULL,
CONSTRAINT ExpenseReport_CK1 CHECK (ERStatusDate >= ERSubmitDate),
CONSTRAINT ExpenseReport_CK2 CHECK (ERStatus = 'PENDING'/'APPROVED'/'DENIED'),
CONSTRAINT ExpenseReport_PK1 PRIMARY KEY(ERNo),
CONSTRAINT ExpenseReport_FK1 FOREIGN KEY(SubmitUserNo) REFERENCES Users(UserNo),
CONSTRAINT ExpenseReport_FK2 FOREIGN KEY(ApprUserNo) REFERENCES (USerNo)
);
INSERT INTO ExpenseReport
(ERNo, ERDesc, ERSubmitDate, ERStatusDate, ERStatus, SubmitUserNo, ApprUSerNo)
VALUES (1,'Sales Presentation','8/10/2002','8/26/2002','APPROVED',3,4);
I've also tried using the TO_DATE but having no luck there,
by any chance can anyone see where i'm going wrong.
Use the DATE keyword and standard date formats:
INSERT INTO ExpenseReport (ERNo, ERDesc, ERSubmitDate, ERStatusDate, ERStatus, SubmitUserNo, ApprUSerNo)
VALUES (1, 'Sales Presentation', DATE '2001-08-10', DATE '2001-08-2006', 'APPROVED', 3, 4);
In addition to the satisfaction of using standard date formats, this protects you against changes in local settings.
In your DDL statement:
CONSTRAINT ExpenseReport_CK2 CHECK (ERStatus = 'PENDING'/'APPROVED'/'DENIED')
Should be:
CONSTRAINT ExpenseReport_CK2 CHECK (ERStatus IN ( 'PENDING', 'APPROVED', 'DENIED' ) )
When you are trying to insert values the check constraint is being evaluated and it is trying to perform a division operation on the three string values'PENDING'/'APPROVED'/'DENIED' which results in ORA-01722: invalid number.
Once you change this then using TO_DATE('01/01/02','DD/MM/YY') (as you wrote in comments) or an ANSI date literal DATE '2002-01-01' should work in your DML statements.
(Note: Be careful using 2-digit years or you can find that dates are inserted with the wrong century.)
Check your date format: select sysdate from dual;
and enter as it show. OR
change your date format: alter session set nls_date_format= 'DD-Mon-YYYY HH24:MI:SS';
It Was Easy :
if Your code Like This just remove hem and write that
Example :
Your code : values ('30178','K111', '22/12/2008')
Do This : values ('30178','K111', '22/Dec/2008')
I am trying to create a table in Oracle a would like to make a data type that is a year:
create table testingTable
(
testID varchar2(3) primary key,
dateDeveloped year(4)
);
The error message I am getting with this is
Error at Command Line : 16 Column : 19
Error report -
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 - "missing right parenthesis"
*Cause:
*Action:
Thank you for your time.
In order to have the community opinion on "how to store year only in a table", I've posted two diametrically opposite answers. I've made them community wiki, so feel free to vote up or down according to your opinion.
If you only want to store 4-digit years, why should you bother with the DATE type? Use a NUMBER(4) instead:
create table testingTable
(
testID varchar2(3) primary key,
yearDeveloped number(4)
);
That way, you will have direct access to the year when using your field.
In order to have the community opinion on "how to store year only in a table", I've posted two diametrically opposite answers. I've made them community wiki, so feel free to vote up or down according to your opinion.
If you want to store "point in time" you should use the DATE type:
create table testingTable
(
testID varchar2(3) primary key,
dateDeveloped date
);
If you are only interested in the year component, it is up to you to extract that when using that field:
extract(year from dateDeveloped)
At insert time, you will convert the 4-digit year to a proper date:
to_date('1984', 'YYYY') -- evaluating to the rather surprising 11/01/1984
Looks like you were using wrong syntax. It should be something like this.
INTERVAL YEAR (precision) TO MONTH
A period of time, represented as years and months. The precision value specifies the number of digits in the YEAR field of the date. The precision can be from 0 to 9, and defaults to 2 for years. Check here for more info
create table testingTable
(
testID varchar2(3) primary key,
dateDeveloped INTERVAL YEAR(4) TO MONTH
);