Converting String Data Value into date - mysql

Good Morning All;
I currently have a MySQL table where there are 3 date fields (Columns) that were loaded as strings in this format 20140101 YYYYmmdd. I would like to convert this to a date format 2014/01/01 YYYY/mm/dd. Can someone please provide a simple sql syntax that would alter the table to a date format from a string and change the column to display the dates like this 2014/01/01 and not like 20140101. Thanks to all

Try this:
date_format(str_to_date(datecolumn, '%Y%m%d'),'%Y/%m/%d')

If you just want to reformat the values in the VARCHAR column, assuming that the column with sufficient length e.g. VARCHAR(10), and all the values are eight characters in length...
You could do something like this:
UPDATE mytable t
SET t.mycol = CONCAT( LEFT( t.mycol ,4)
, '/'
, SUBSTR( t.mycol ,5,2)
,'/'
, SUBSTR( t.mycol ,7,2)
)
WHERE CHAR_LENGTH(t.mycol) = 8
We want something in the statement that will prevent the statement from "working" a second time, if it's inadvertently re-run. It doesn't have to be CHAR_LENGTH. We might want to include a check that the value doesn't already contain a slash character AND t.mycol NOT LIKE '%/%'.
But why on earth are "date" values being stored in character columns, rather than in DATE datatype, which is custom designed for storing and working with date values?
ALTER TABLE mytable MODIFY mycol DATE ... ;
(If the column is defined as NOT NULL, has a default value, has a comment, those attributes can be retained, they need to be included in the new column specification, e.g.
ALTER TABLE mytable MODIFY mycol DATE NOT NULL COMMENT 'creation date';
Note that DATE columns do not have a "format" per se. When converting to string, MySQL uses date format '%Y-%m-%d'. And MySQL expects string literals representing date values to be in that same format. To get a value from a DATE column converted to string in format 'yyyy/mm/dd'.
SELECT DATE_FORMAT(date_col,'%Y/%m/%d') AS date_col
To get a string value in that format converted to DATE datatype
SELECT STR_TO_DATE('2015/06/01','%Y/%m/%d')

Related

How to convert VARCHAR column cell values to date format?

I have customers data translated into DB table in which few cell values in column type Varchar, contains date and few doesnt. The ones that contains Date in certain format, need to be converted into another one which will be further used for data analysis jobs. I tried below query but it shows errors for the cells which doesnt have date. How do I resolve this?
Basically I want to strip off the actual time and append 000000 in place of actual time, along with the date.
Query:
UPDATE Table1
SET C1 = DATE_FORMAT(C1,'%Y%m%d000000')
WHERE DATE_FORMAT(C1,'%Y%m%d%H%i%s') AND C1 IS NOT NULL;
Error:
Code : 1292
Truncated incorrect datetime value: 'EVN'
You need to use STR_TO_DATE() to parse the date that's in the VARCHAR column.
You can use a regular expression to test if the column contains a date in MM/DD/YY format.
UPDATE Table1
SET C1 = DATE_FORMAT(STR_TO_DATE('%m/%d/%y', C1), '%Y%m%d000000')
WHERE C1 RLIKE '^[01][0-9]/[0-3][0-9]/[0-9][0-9]$'

MySQL: How to set a DATE column by converting all values in a VARCHAR column?

I have a table in which there is a column called "DATE" which contains dates in the format "23-Nov-2017" as datatype VARCHAR. I'm trying to convert this VARCHAR column and store it in a new column called "NEWDATE" of datatype DATE.
I have created the new column "NEWDATE" of type DATE and I am trying to use the STR_TO_DATE() function to perform the conversion. However, I can't get it to work for some reason.
UPDATE table SET NEWDATE = STR_TO_DATE(DATE,'%d-%m-%Y');
The NEWDATE column is not updated with any values after the statement. I guess this means that the statement does not execute. What am I doing wrong?
EDIT: I have also tried STR_TO_DATE(DATE,'%d-%b-%Y'). However there is still no change to the values in the NEWDATE column
Your format '%d-%m-%Y' does not match your actual date string "23-Nov-2017"
The %m is for numeric month and you have an abbreviated text month
Use %b for 3 char month values like this:
STR_TO_DATE(DATE,'%d-%b-%Y')
EDIT: WorkBench issue
That is just a Workbench config setting to stop you accidentally issuing a HUGE update. You can either turn that setting OFF or frig it a bit by giving it a WHERE clause that will allow it to run like below. Below assumes this table has an id column
UPDATE table SET NEWDATE = STR_TO_DATE(DATE,'%d-%b-%Y') WHERE id<10000000;
Or
UPDATE table SET NEWDATE = STR_TO_DATE(DATE,'%d-%b-%Y') WHERE id>0;

Copy values one MySQL column to another, but formatted

I have added a DATE column to a table, but now need to populate that DATE column with the values from another column - except that original column is an INT. The INT column is mmddyyyy. Is there a way to copy and format using
UPDATE `table` SET int_column = date_column
Try this using str_to_date and lpad functions:
UPDATE `table` SET date_column = str_to_date(lpad(int_column, 8, 0),'%m%d%Y')
Why used lpad(int_column, 8, 0) - When date is, say, 02012017, the direct cast to char will convert it into 2012017, for which str_to_date function will return null. Lpad pads required 0 to make length 8 and hence outputs 02012017 which str_to_date function will correctly convert.

How to get valid dates from a varchar column where dates are stored in different formats

I have a column in a table in MySql, which contains dates as string in any format (there is not fixed pattern) it could be as m-d-y or M-D-Y or m/d/y or YY/MM/DD or MM/DD/YY or mm/dd/yy etc. My question is how should I detect it and then change to some particular format i.e mm/dd/yy.
If you can guess the number of different formats you stored the dates in a varchar field then it would be easier to deal with the problem;
One way would be put all those different formats in the query given below:
SELECT
COALESCE(
STR_TO_DATE(your_date_column,'%m-%d-%Y'),
STR_TO_DATE(your_date_column,'%M-%D-%Y'),
STR_TO_DATE(your_date_column,'%m/%d/%Y'),
STR_TO_DATE(your_date_column,'%m-%d-%Y'),
....
.
.
)
FROM your_table;
Demonstration:
SET #your_date_field := '8/8/2016';
SELECT
COALESCE(
STR_TO_DATE(#your_date_field,'%m-%d-%Y'),
STR_TO_DATE(#your_date_field,'%M-%D-%Y'),
STR_TO_DATE(#your_date_field,'%m/%d/%Y'),
STR_TO_DATE(#your_date_field,'%M/%D/%Y')
);
Output: 2016-08-08 (yyyy-mm-dd)
Note:
But dates should be stored in a date datatype. Violating this will put towards this kind of cumbersome situation.
So, better move these date strings to date datatype column.
More: In order to move these date strings to a date datatype column you can follow the steps below:
ALTER TABLE your_table ADD COLUMN date_new date;
UPDATE
your_table
SET date_new = COALESCE(
STR_TO_DATE(your_date_column,'%m-%d-%Y'),
STR_TO_DATE(your_date_column,'%M-%D-%Y'),
STR_TO_DATE(your_date_column,'%m/%d/%Y'),
STR_TO_DATE(your_date_column,'%m-%d-%Y'),
....
.
.
);
ALTER TABLE your_table DROP COLUMN `date`;
ALTER TABLE datestable CHANGE COLUMN `date_new` `date` date;

Convert varchar column to date in mysql at database level

I have one column date1 which is varchar type
I want this column to date type.
I tried changing field but all date is converted to 0000-00-00.
format is dd-mm-yyyy but in varchar.
How can I convert the same date format but with date format using sql queries or similar but at database level ?
UPDATE `table`
SET `column` = str_to_date( `column`, '%d-%m-%Y' );
More about STR_TO_DATE function.
Since your column name is date1, you can replace column with date1 in the above syntax, and the code shall be:
UPDATE `table`
SET `date1` = str_to_date( `date1`, '%d-%m-%Y' );
The other answers here are risky, because if they go wrong you'll lose your data. A safer way to do this is to create a new field on your database with a DATE (or DATETIME if you need time as well) format, then to run a query like
UPDATE `table` SET `my_new_date_field` = STR_TO_DATE( `my_old_data_field`, '%d/%m/%Y');
In this way, if the %d/%m/%Y bit is wrong, you won't lose your data.
Once you're happy, you can delete the old data field and rename the new one.
use STR_TO_DATE Function of MySQL
FIRST you will need to update the value in date format.
UPDATE `tbl` SET `date1` = STR_TO_DATE(`date1`, '%d-%m-%Y') WHERE 1=1
THEN Convert the field to date.
Most importantly remember to insert date as Y-m-d format, after then.