STR_TO_DATE outputs NULL - mysql

I have a problem with the use of the STR_TO_DATE function.
My date has the following format
24.04.2012 11:24:50:360
I want to write it in my MySQL Column, where the format is
2012-04-24 11:24:50
To check if my statement is correct, I'm testing it with
SELECT STR_TO_DATE('24.04.2012 11:24:50:360', '%Y-%m-%d %H:%i:%s')
Everytime I run this, it returns NULL. I have no idea how I have to correct the query.

Try with this:
SELECT STR_TO_DATE('24.04.2012 11:24:50:360', '%d.%m.%Y %H:%i:%s')
(the format in your statement is not correct, you need to swap the year month and day, and you need to use . as a separator)

Related

How to convert a date string to mysql date format for calculating date diff using mysql query

I have a column where a date store in ddmmyy format (e.g. 151216). How can I convert it to yyyy-mm-dd format (e.g 2016-12-15) for calculating a date difference from the current date? I try using DATE_FORMAT function but its not appropriate for this.
If you want to get the date difference, you can use to_days() after converting the string to a date using str_to_date():
select to_days(curdate()) - to_days(str_to_date(col, '%d%m%y'))
or datediff():
select datediff(curdate(), str_to_date(col, '%d%m%y'))
or timestampdiff():
select timestampdiff(day, str_to_date(col, '%d%m%y'), curdate())
You can use the function, STR_TO_DATE() for this.
STR_TO_DATE('151216', '%d%m%y')
A query would look something like:
select
foo.bar
from
foo
where
STR_TO_DATE(foo.baz, '%d%m%y') < CURDATE()
Note: Since both STR_TO_DATE() and CURDATE() return date objects, there's no reason to change the actual display format of the date. For this function, we just need to format it. If you wanted to display it in your query, you could use something like
DATE_FORMAT(STR_TO_DATE(foo.baz, '%d%m%y'), '%Y-%m-%d')
To get the difference, we can simply subtract time
select
to_days(CURDATE() - STR_TO_DATE(foo.baz, '%d%m%y')) as diff
from
foo
If you wanted to only select rows that have a difference of a specified amount, you can put the whole to_days(...) bit in your where clause.
SELECT STR_TO_DATE('151216', '%d%m%y') FROM `table`
use this '%d%m%y'

SQL get date from timestamp

I have a database where all my data have a unix timestamp as a integer, the integer is the amount of seconds since 1.jan 1970.(like what Time.now.to_i returns in ruby http://www.unixtimestamp.com).
Is there any way i can get the date from 1447277423 in SQL? I need to group the rows by date.
I want this to be done in a view, and not use another script to do it.
Is this possible?
Convert the unix timestamp to date only (since you don't want hours/seconds), then group by it.
SELECT * FROM table
GROUP BY FROM_UNIXTIME(date_timestamp, '%Y %m %d');
Or, if you don't want to actually group them and just want them outputted all in order, ORDER BY instead.
SELECT * FROM table
ORDER BY date_timestamp
/* when ordering, it doesn't matter so much if its the whole timestamp or not since the date comes first in the timestamp */
To go one further, you can SELECT the formatted date as well
SELECT *, FROM_UNIXTIME(date_timestamp, '%Y %m %d') as date_Ymd FROM table
ORDER BY date_timestamp;
FROM_UNIXTIME docs
Just use FROM_UNIXTIME():
group by DATE(FROM_UNIXTIME(your_unix_timestamp_field))
That is the nice part of unix timestamps, you can just treat it as an integer.
SELECT something FROM table WHERE date >= 1447277423
Hope this helps

MySQL: str_to_date multiple formats

I have a ETL cleanup project where I have a unioned date column that includes formats such as "2014-10-14" and "10/14/2014 12:00:00 AM". I am trying to find a slick way I can convert them all using a str_to_date function either in a case statement or some other way to help determine which format it is and then convert it to a date.
So far all my efforts have failed. Any thoughts?
str_to_date will return NULL if the particular conversion fails, so you can try doing one first. If the result is NULL, try the other format.
For example:
coalesce(
str_to_date(create_date, '%Y-%m-%d'),
str_to_date(create_date, '%m/%d/%Y %h:%i:%s %p'),
str_to_date(create_date, '%d/%b/%Y %H:%i:%s')
)

Why does MySQL DATE_FORMAT function return NULL when formatting a TIME value?

select DATE_FORMAT('8:48:30 AM', '%H:%i:%s')
It returns Null why ?
but when using
select DATE_FORMAT(CURTIME(), '%H:%i:%s')
It return formatted value.
It's returning NULL because MySQL isn't successfully parsing the string into a valid DATETIME value.
To fix the problem, use the STR_TO_DATE function to parse the string into a TIME value,
SELECT STR_TO_DATE('8:48:30 AM', '%h:%i:%s %p')
Then, to get the TIME value converted to a string in a particular format, use the TIME_FORMAT function, e.g. 24-hour clock representation:
SELECT TIME_FORMAT(STR_TO_DATE( '8:48:30 AM', '%h:%i:%s %p'),'%H:%i:%s')
returns:
--------
08:48:30
The method DATE_FORMAT is used to display date and time, however in the first you are not assigning any date except time, so its is throwing null.
From the manuals -
DATE_FORMAT Formats the date value according to the format string.
In MySql version 5.5 SELECT DATE_FORMAT( CURTIME( ) , '%H:%i:%s' ) returns null
DATE_FORMAT 's first parameter is of type DATETIME. On recent mysql server versions both your queries return NULL.
So the answer to your question is that this difference in behaviour is because of a bug in your mysql version - in some way it converts the TIME to DATETIME, while it cannot convert the string to DATETIME.
Here is also an example of a working query:
select DATE_FORMAT(NOW(), '%H:%i:%s')
NOW() returns a DATETIME while CURTIME() returns TIME.
To my knowledge, I think it's because MySQL recognises the function as a time, and therefore knows how to handle it. Whereas, in the first example, it regards it as a string and doesn't know what to do with it.

Convert a obscure? date format in a sql query to a human readable one

I've got a date format in a bigint field in this format "20130314123743" - YYYYMMDDHHMMSS and i need to do a mysql query on it and get it back to the user in something like yyyy-mm-dd hh:mm:ss.
Is there a native mysql function that will take that date format and return it to something human readable?
One approach:
select cast(cast(bigintdateval as char(14)) as datetime)
SQLFiddle here.
To convert to a datetime you can use MySQL function FROM_UNIXTIME
FROM_UNIXTIME (unix_timestamp, [format ])
SELECT FROM_UNIXTIME(20130314123743, '%Y-%m-%d %h:%i:%s');
Exemple;
SELECT FROM_UNIXTIME(birthDay/100000, "%Y-%m-%d %H:%i:%s") AS date
FROM person;
source
FROM_UNIXTIME
Hope that help