I'm a freshman in sql. So that recently my lecture had give us one practical.
The practical file was showing an error.
INSERT INTO sales VALUES ('6380', '1111', '2012-10-01 00:00:00', 2, '30', 'TC7777');
The error was 00:00:00. As my lecture say SQL did not allow this format
So here comes my question:
- Is that possible SQL keep tracking all the time , like the 00:00:00 ?
- And is that SQL are key sensitive , SELECT and select or I should keep the habit that put all in upper case ?
Speaking to Oracle only, the database ALWAYS stores times with date/timestamp values. You just have to properly tell it to do so. In your example, you could say:
INSERT INTO sales
VALUES ('6380', '1111', TO_DATE('2012-10-01 00:00:00','YYYY-MM-DD HH:MI:SS')...
The default format for date values in Oracle is governed by the NLS_DATE_FORMAT system parameter in the database. If you don't explicitly supply date values with the TO_DATE function, Oracle will expect date strings to conform to this format. That's why you're getting an error in your example. Also, if you don't supply a time value, it defaults to 00:00:00.
The same principle applies on output, too. You can accept the default output for a date value by simply selecting the value:
SQL> select sysdate from dual;
SYSDATE
---------
27-JUN-15
SQL>
Or you can format it with TO_CHAR:
SQL> select TO_CHAR(sysdate, 'YYYY-MM-DD HH24:MI:SS') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2015-06-27 11:10:48
SQL>
Is that possible SQL keep tracking all the time , like the 00:00:00 ?
If your Datatype in SQL table is Date, By default in Oracle, Default format for date is Date only so If you are specifying Time with date while inserting data you get error.
To Insert time with date, you have to convert date format while insert data
TO_DATE('2003/05/03 21:02:44', 'yyyy/mm/dd hh24:mi:ss')
SEE Example
You can change this default date format with
alter session set nls_date_format= your date format here
NLS_DATE_FORMAT Refer Here
is that SQL are key sensitive , SELECT and select or I should keep the
habit that put all in upper case ?
SQL is not case sensitive, you can use either one, UPPER CASE, lower case or even Camel Case. Example :- SELECT or select or even Select. Just for better readability, Prefer to use All keywords in UPPER Case.
Related
I am using Oracle database. I have a table called "TEST" where the dates/timestamps(These are stored as "Char" in my case) are stored in the following format. Now I want to retrieve the records of last twelve months based on today's date. What would be the correct way to do that?
TESTCOLUMN
------------
2019-06-28-02.01.07.327240
2020-06-28-04.49.12.480240
2020-06-28-05.05.10.681240
I think you need to use the ADD_MONTHS function and BETWEEN clause as follows:
SELECT * FROM YOUR_TABLE
WHERE TO_TIMESTAMP(YOUR_COLUMN,'YYYY-MM-DD HH24.MI.SS.FF')
BETWEEN ADD_MONTHS(SYSTIMESTAMP,-12) AND SYSTIMESTAMP;
Although storing values in a string is not recommended, your format is comparable. So you can do the comparison using strings rather than date/timestamps. Assuming your values are only in the past:
where testcolumn >= to_char(SYSTIMESTAMP, -12), 'YYYY-MM-DD HH24.MI.SS.FF')
This has an advantage over Tejash's solution, because this can make use of an index (or partitions) on testcolumn. Moving the date manipulations only on the "constants" (i.e. the system timestamp) helps the Oracle optimizer.
I'm in coldfusion working with data from an sql table, and using a query of queries to join the sql data to some data from an oracle database. Unfortunately, I need to order them by date, and the oracle table has two columns - DRWR_DATE which is of type DATE and TIME which is of type VARCHAR2. The two columns put into a string read 17-JUN-03 16:35:18 or something similar. I need to return these two columns as a TIMESTAMP so I can use query of queries to sort them.
Also, I think I read that a date column holds the time in Oracle anyway? I don't have much experience with Oracle so I am unsure how best to do this.
Try this:
SELECT to_timestamp(
to_char( drwr_date,'dd-mon-yy') ||' '|| time
, 'dd-mon-yy hh24:mi:ss'
)
FROM your_table
Try using TO_TIMESTAMP function:
SELECT TO_TIMESTAMP('17-JUN-03 16:35:18', 'DD-MON-RR HH24:MI:SS')
FROM DUAL;
you can try converting the column to date as the following:
TO_DATE(column,'DD-MON-YY HH24:MI:SS')
The first parameter takes your column and the second parameter specifies the date format that is used
If all you have to do is order by date, all you need is an order by clause.
order by drwr_date, time
You don't have to cast these to anything, unless you need to do so for another reason. Remember that a date datatype is essentially a floating point number. This, "17-JUN-03" is simply how your client is displaying it.
I used the relational model in SQL Model developer from Oracle to create this table:
CREATE TABLE Orders
(
OrderNum INTEGER NOT NULL ,
OrderDate DATE ,
TIME DATE ,
Employee_EMP_CODE VARCHAR2 (10) NOT NULL ,
Tax_Id VARCHAR2 (10) ,
Tax_Rate VARCHAR2 (10) ,
Customers_Customer_No INTEGER NOT NULL ,
Consoles_Console_NO VARCHAR2 (10) NOT NULL ,
Customers_Buyer_First_Name VARCHAR2 (10) NOT NULL ,
Customers_Buyer_Last_Name VARCHAR2 (10) NOT NULL ,
Comments VARCHAR2 (250)
) ;
For some reason it will not take the time value when I try to insert a row. I have tried these formats
'12:31:00'
'12.31.00'
It keeps giving me the error that the month value isn't valid.
An Oracle date column always has a day and a time component. It makes no sense to have two columns OrderDate and Time both of type date. Your OrderDate would have a time component and your Time would have a day component. Realistically, you just want a single column of type date that has both the day and the time that the order was placed.
If you are trying to insert data into a date column, you would either want to pass the proper data type from your client application (i.e. bind a date in your client application when you create your insert statement) or you would want to do an explicit conversion from a string using the to_date function. For example
INSERT INTO Orders( OrderNum, OrderDate, <<more columns>> )
VALUES( 1, to_date( '2014-07-12 12:31:00', 'YYYY-MM-DD HH24:MI:SS' ), <<more values>> );
To answer your question "What format does Oracle expect for a DATE value?"
You can look at your NLS_DATE_FORMAT:
SQL> SHOW NLS_DATE_FORMAT
Assuming you're using Default, it should come back with something like: DD-MON-RR
You could actually insert or select without To_Date like this:
Select * from Orders Where OrderDate = '25-DEC-04';
To answer your real question: How should I store my orderDate :)
It seems you're storing Order Date, and Order Time in two separate fields.
There is really no need to do this, as this means you'll be using twice the disc space for your data field, which you only actually need 1 field.
as DATE datatype will store both Date and Time, you can actually just use 1 field, and this will make life a lot easier when trying to select your data as well.
You really should look at using sysdate at the moment your order is place.
ie:
SELECT TO_CHAR
(SYSDATE, 'MM-DD-YYYY HH24:MI:SS') "OrderDate"
FROM DUAL;
NOW
-------------------
04-13-2001 09:45:51
Also please notice that i've made use of TO_CHAR for printing purposes only.
when inserting, you will simply do:
Insert into Orders(OrderDate, other fields) Values (sysdate, other fields);
I hope this helps.
Oracle is very annoying when it comes to date stuff. However, I have had good luck with this format:
{ts 'yyyy-mm-dd HH:mi:ss'}
year, month, day, hours, minutes, seconds. Use leading zeros if appropriate. Use 24 hour clock for hours.
Question1:
Do i have to use to_date while inserting date?
INSERT INTO some_table (date1, date2)
VALUES (to_date('2012-10-24','YYYY-MM-DD'), to_date('2012-10-24','YYYY-MM-DD'));
Or can just insert as string? Will everything be OK this way too? I've tried and it worked.
INSERT INTO some_table (date1, date2)
VALUES ('2012-10-24',2012-10-24');
Question2:
What happens if i won't name columns that i'm inserting into? It works, but my question is if it inserts randomly now or it takes order of columns during creation of table?
INSERT INTO some_table
VALUES ('2012-10-24',2012-10-24');
1 seems to only work with the 'YYYY-MM-DD' format:
http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements003.htm#SQLRF51049 says
You can specify a DATE value as a string literal ... to specify a DATE value as a literal, you must use the Gregorian calendar. You can specify an ANSI literal... The ANSI date literal contains no time portion, and must be specified in the format 'YYYY-MM-DD'.
However, it might work with time if you use the
Alternatively you can specify an Oracle date value... The default date format for an Oracle DATE value is specified by the initialization parameter NLS_DATE_FORMAT.
For question 2, it uses the order at definition of the table. However you have to give values for all columns in that case.
Oracle supports Standard SQL date literals (since 9i).
It's DATE followed by a string with 'yyyy-mm-dd' format
DATE '2014-05-10'
It's much shorter than TO_DATE and it's independent of any NLS settings.
Similar for timestamps:
TIMESTAMP '2014-05-10 09:52:35'
Regarding your 2nd question: It's the order of columns as defined within the CREATE TABLE.
You could even do it like this one:
ALTER SESSION SET NLS_DATE_FORMAT = 'MM:YYYY:DD';
INSERT INTO some_table (date1) VALUES ('05:2014:10');
...but doing it like this is not recommended. Use TO_DATE or DATE Literal, e.g. DATE '2014-05-10' instead. It makes your life easier.
I'm using Oracle 11g Schema
I want to select the month and day from a date concatenate it and put it into a column.
The syntax I have here makes sense but its throwing an error of..
INSERT INTO OB_SELECT_LST12_SPG WED
VALUES (((TO_CHAR(TO_DATE('RET_DATE', MM))||( TO_CHAR(TO_DATE('RET_DATE', DD)));
"SQL Error: ORA-00907: missing right parenthesis"
Any help is greatly appreciated.
Thanks.
Some points first...
Your table name has a space in in
Your not enough columns error is caused by you having more than one column in the table
You really shouldn't be doing this at all
If ret_date is a column don't encapsulate it in quotation marks (') as you won't be able to convert the string 'ret_date' into a date.
However, assuming ret_date is a string that looks like 13-06-2012
insert into ob_select_lst12_spg_wed (my_column)
values(to_char(to_date(:ret_date,'dd-mm-yyyy'),'mmdd'));
If ret_date is a date data-type then you can remove the inner conversion.
insert into ob_select_lst12_spg_wed (my_column)
values(to_char(:ret_date,'mmdd'));
to_char and to_date both make use of datetime format models, which have a number of options.
Please don't do this though. Always store dates as dates
From your comments ret_date is a date and the column wed is a character. You're getting the error bind variable not declared because you haven't specified the variable. I'm going to assume that ret_date is in another table as it's a date, in which case lose the values key-word and insert directly from that table:
insert into ob_select_lst12_spg (wed)
select to_char(ret_date,'mmdd')
from the_other_table
This shouldn't be required though, you can always convert a date into whatever you want on exit from the database. If you don't store it as a date in the database then it's easy for errors and incorrect values to creep in. I personally would change the column wed to a date, in which case your query becomes the very simple:
insert into ob_select_list12_spg (wed)
select ret_date
from the_other_table
You can then use the correct datetime format model for your needs when selecting from the database.
Sample query to get date, month from date column:
Select ((To_Char(to_date('01-FEB-73','dd-mon-yy'), 'MM'))
||( To_Char(to_date('01-JAN-73','dd-mon-yy'), 'dd')))
from dual;
if RET_DATE is date datatype then use
insert into table_name (columname)
Select ((To_Char(RET_DATE, 'MM'))
||( To_Char(RET_DATE, 'dd')))
from dual;
You are missing extra parentheses. Number of opened ( was 8 and closed ) was 5
INSERT INTO OB_SELECT_LST12_SPG(WED)
VALUES ((TO_CHAR(TO_DATE(RET_DATE, MM)))||( TO_CHAR(TO_DATE(RET_DATE, DD))));
Update
Make sure other columns are not required (i.e. Allow NULLs)