Replace the time as 0's in datetime column - sql

Experts,
I need to convert the time value as 0's in a datetime column leaving behind 00:00:00.000.
Sample data:
2019-04-17 08:47:51.433
2019-04-17 00:00:00.000
Kindly suggest a key code.
Thanks in advance!

As you appear to want to keep a time of 00:00:00.000 you could use
SELECT DATE_FORMAT('2019-04-17 08:47:51.433' , '%Y-%m-%d 00:00:00.000');
RESULT
2019-04-17 00:00:00.000

To trim the time part, you can just use MySQL date function DATE():
Demo on DB Fiddle:
select DATE('2019-04-17 08:47:51.433')
| DATE('2019-04-17 08:47:51.433') |
| :------------------------------ |
| 2019-04-17 |

I will assume that you really only want to view your datetime data this way. If so, then you should use DATE_FORMAT with a mask containing only the date portion:
SELECT
dt AS datetime,
DATE_FORMAT(dt, '%Y-%m-%d') AS dateonly
FROM yourTable;
Unless you are certain that you would never need the time information, it makes no sense to throw that away.

Related

SQLite DateTime query - why it doesnt work?

I have below table in my SQLite DB.:
CREATE TABLE [TICK] (
TS DATETIME NOT NULL,
PRICE DECIMAL(10,3) NOT NULL
);
Im trying to filter out given date & time range - for example:
SELECT * FROM TICK t WHERE ts between '2017-01-25 21:44:13' AND '2017-03-21 16:35:14'
But this returns 1st record with ts=2017-01-26 08:00:00, while '2017-01-25 21:45:12' is expected
I can improve that by casting ts as DateTime:
SELECT * FROM TICK t WHERE datetime( ts) between '2017-01-25 21:44:13' AND '2017-03-21 16:35:14'
But I dont understand why I need to do that (if TS column is already DateTime Type) ?
Also performance of such query is 10x slower than 1st one
Please advise how to deal with TimeStamps in Sqlite... (I havent such issues in other DB engines)
Example data:
TS |PRICE |
--------------------+--------+
2017-01-30 08:00:00|2293.598|
2017-01-30 08:01:00| 2287.14|
2017-01-30 08:02:00|2287.194|
2017-01-30 08:03:00|2287.335|
2017-01-30 08:04:00| 2287.23|
2017-01-30 08:05:00|2287.078|
2017-01-30 08:06:00|2287.156|
2017-01-30 08:07:00|2287.063|
2017-01-30 08:08:00|2286.782|
Summarizing this up for others' benefit
Ive learnt that:
SQLlite does not really have DateTime type,
but DDL allows to create such field type
Ive overlooked I had 2 spaces between date and time - what caused issue
As Sqlite doesn't have such type you cannot count on it it will be controlling what you put into such field
All credits to #forpas

format datetime in big query select FORMAT_DATETIME('%Y-%m-%d %H:%M:%E*S','0001-01-01')

I need to make the date in the below particular format in big query, but somehow it is truncating leading zero's automatically. How to get the output as is.
Query used:
select FORMAT_DATETIME('%Y-%m-%d %H:%M:%E*S','0001-01-01')
output: 1-01-01 00:00:00
Desired output: 0001-01-01 00:00:00
Please help.
Use $E4Y for the year:
select FORMAT_DATETIME('%E4Y-%m-%d %H:%M:%E*S', '0001-01-01')
'%Y' uses only as many characters as needed for the year. '%E4Y' always uses 4 characters.

Showing month and year

I have a query that results in a timestamp value along with certain other calculations.
The result looks something like below -
City DateTime Value
London 2009-01-01 00:00:00.000000 22
New York 2010-01-01 00:00:00.000000 33
... ... ...
Is there any way to obtain the dateTime column with month and year - something like Jan-2009 and Jan-2010 instead of entire timestamp. I don't want to use the case statement.
t=# select now(),to_char(now(),'Mon-YYYY');
now | to_char
-------------------------------+----------
2017-09-20 07:49:34.360483+00 | Sep-2017
(1 row)
https://www.postgresql.org/docs/current/static/functions-formatting.html
to_char(timestamp, text)
and
https://www.postgresql.org/docs/current/static/functions-formatting.html#FUNCTIONS-FORMATTING-DATETIME-TABLE
for formats
the postgresql data type formating function to_char can solve this problem. It takes 2 arguments, a timestamp and a template pattern string, and return a date string according to the provided pattern. see Postgresql documentation for the complete pattern list.
You can try something like the following:
select city, to_char(your_date_field, 'Mon-YYYY'), value from your_table

Select between varchar as a date returns null

I have a table attendance_sheet and it has column string_date which is a varchar.
This is inside my table data.
id | string_date | pname
1 | '06/03/2013' | 'sam'
2 | '08/23/2013' | 'sd'
3 | '11/26/2013' | 'rt'
I try to query it using this range.
SELECT * FROM attendance_sheet
where string_date between '06/01/2013' and '12/31/2013'
then it returns the data.. but when I try to query it using this
SELECT * FROM attendance_sheet
where string_date between '06/01/2013' and '03/31/2014'
it did not return any results...
It can be fixed without any changing the column type for example the string_date which is a varchar will be changed into a date?
Does anyone has an Idea about my case?
any help will be appreciated, thanks in advance ..
Use strftime
SELECT * FROM attendance_sheet
where strftime(string_date,'%m/%d/%Y') between '2013-06-01' and '2013-31-21'
The reason this:
where string_date between '06/01/2013' and '03/31/2014'
does not return any results is that '06' is greater than '03'. It's essentially the same as using this filter.
where SomeField between 'b' and 'a'
The cause of this problem is a poorly designed database. Storing dates as strings is a bad idea. Juergen has shown you a function that might help you, but since your field is varchar, values like, 'fred', 'barney', and 'dino' are perfectly valid. The Str_to_date() function won't work very well with those.
If you are able to change your database, do so.
To be able to do string comparisons correctly, you have to change your database so that the most significant field of the date comes first, i.e., use the format yyyy-mm-dd.

Numbers to Dates in SQL Where Statement

I have a table with 2 columns, EffectiveBeginDate and EffectiveEndDate. However, they're in a number YYYYMMDD format so for example:
Agent | EffectiveBeginDate | EffectiveEndDate
John Doe | 20080922 | 20080924
Mark Smith| 20100922 | 20110226
etc. etc.
I need to do 2 things. First, I need to have a formula to change the EffectiveBegin/End dates to an actual date format in my Select statement.
More importantly, I need to be able to query this column in my where statement as if they were acutal dates b/c the where clause is going to be something like:
Where EffectiveStartDate between '01/01/2010' and '01/31/2010'
Thoughts?
In SQL SERVER it is sufficient to perform CONVERT(DATETIME, dateTimeField) when dateTimeField is in the format "yyyymmdd".
Update:
For numeric dates, use this:
CONVERT(DATETIME, CONVERT(char(8),dateTimeField) )