How can I do to extract some information with SQL Server ? - sql

I have this column with Microsoft SQL Server :
Date
6/19/2019 3:10:12 PM
12/23/2016 5:02:15 AM
13/25/2015 2:15:35 PM
And I would like to get two new column like this :
Date Hour
06/19/2019 15:10:12
12/23/2016 05:02:15
13/25/2015 14:15:35
For the first column I just split the original column and I add a 0 for the first line and for the second I add a 0 and transform 03 to 15 removing PM. Thank you very much for the help !

If I understand correctly, you would just cast to the types you want:
select cast(datetimecol as date) as datecol,
cast(datetimecol as time) as timecol
from t;

You can use try_parse as another option if it is a varchar column.
select try_parse('6/19/2019 3:10:12 PM' as date using 'en-US')
select try_parse('6/19/2019 3:10:12 PM' as time using 'en-US')
Or for your query
select
try_parse('datetimecol' as date using 'en-US'),
try_parse('datetimecol' as time using 'en-US')

Related

Is there a quick way to separate date and time from a time stamp in sql?

I am using sql to calculate the average daily temperature and max daily temperature based on a date timestamp in an existing database. Is there a quick way to accomplish this?
I am using dBeaver to do all my data calculations and the following code is what I have used so far:
SELECT
convert(varchar, OBS_TIME_LOCAL , 100) AS datepart,
convert(varchar, OBS_TIME_LOCAL, 108) AS timepart,
CAST (datepart AS date) date_local,
CAST (timepart AS time) time_local
FROM
APP_RSERVERLOAD.ONC_TMS_CUR_ONCOR_WEATHER;
The data format as follows:
ID time_stamp temp
--------------------------------------------
de2145 2018-07-16 16:55 103
There are multiple IDs with 24hrs of temperature data at 1 min increments.
I am not sure if I understand what you need but I will try:
Your question: "Is there a quick way to separate date and time from a time stamp in sql?"
Answer:
select to_char(datec, 'hh24:mi')
, to_char(datec, 'yyyy-mm-dd')
from test;
Use to_char with format to select date part and time part.
You seem to want aggregation:
SELECT convert(date, OBS_TIME_LOCAL) AS datepart,
avg(temp), max(temp)
FROM APP_RSERVERLOAD.ONC_TMS_CUR_ONCOR_WEATHER
GROUP BY convert(date, OBS_TIME_LOCAL);

UTC and offset date time compare in sql server

I am storing UTC datetime in Database
e.g.
2018-06-05 11:37:00.000 (UTC)
2018-06-05 17:07 (+5:30 India standart time)
I am having offset as :
offset as +02:00
How can I compare in sql query that now offset time matched ?
e.g.
2018-06-05 13:37:00.000
My issue is X (IST) date time converted to UTC and now I want to covert to different time zone (Y)
The following functions helped me to resolve the issue:
1. SWITCHOFFSET
2. TODATETIMEOFFSET
SELECT GETDATE()
SELECT SWITCHOFFSET(GETDATE(), '+05:30')
SELECT CONVERT(VARCHAR(19), SWITCHOFFSET(TODATETIMEOFFSET(GETDATE(), '+05:30'),'+00:00'), 120)
SELECT GETUTCDATE()
If I understand your question correctly, you can use the DATEADD function to calculate the new datetime based on the UTC datetime and the offset
For example:
2 hours = 120 minutes
DATEADD(minute, 120, '2018-06-05 11:37:00.000')
Or using hours
DATEADD(hour, 2, '2018-06-05 11:37:00.000')
You can also go the other way using negative numbers
You don't have to use a literal value, you can supply a column name to parameter 3 for use in a query and also use this expression as part of a where clause
Here's a cheat sheet for the DATEADD function:
https://learn.microsoft.com/en-us/sql/t-sql/functions/dateadd-transact-sql?view=sql-server-2017

SQL query with operator between and date in a strange format

I have a column in my table that stores a date in format (DD-MM-YY HH:MM:SS). For e.g.:
05-06-15 01:02:03
I need to output for instance all the records that have a date between the 4th and the 5th of June, so i tried:
SELECT * from table where date BETWEEN '04-06-15 00:00:00' AND '05-06-15 23:59:59'
But it also output results with a different month, as:
05-07-15 14:52:34
Is there a way to use a single query for solving this issue or I have to change all my database date format?
SELECT *
from table
where
STR_TO_DATE(date,'%d-%m-%Y %T') between
'2015-06-05 00:00:00' and '2015-06-5 23:59:59';

Take 1 hour from time field

I have an time field which is in string format 'varchar' and I wish to convert this field to a time and take an hour from the converted value so that if I have 14:22 in the field I would get 13:22 in the converted value. How would I do this in a view?
For SQL Server, you can use the following query:
select dateadd(hh,-1 ,cast(timecolumn as time)) from tablename
If using MySQL, use DATE_SUB to subtract a time period.
SELECT DATE_SUB(timefield, INTERVAL 1 HOUR) AS timefield_minus_hour
This works with MS SQL 2012: Fiddle Demo
SELECT DATEADD(HH,-1 ,CAST(stringTime as time)) FROM myTable

how to have the right sum of type Time with sql [duplicate]

How to caculate sum of times of my colonne called "timeSpent" having this format: HH:mm
in SQL? I am using MySQL.
the type of my column is Time.
it has this structure
TimeFrom like 10:00:00 12:00:00 02:00:00
TimeUntil 08:00:00 09:15:00 01:15:00
Time spent
total time 03:15:00
SELECT SEC_TO_TIME( SUM( TIME_TO_SEC( `timeSpent` ) ) ) AS timeSum
FROM YourTableName
100% working code to get sum of time out of MYSQL Database:
SELECT
SEC_TO_TIME( SUM(time_to_sec(`db`.`tablename`)))
As timeSum
FROM
`tablename`
Try and confirm.
Thanks.
In MySQL, you would do something like this to get the time interval:
SELECT TIMEDIFF('08:00:00', '10:00:00');
Then to add the time intervals, you would do:
SELECT ADDTIME('01:00:00', '01:30:00');
Unfortunately, you're not storing dates or using 24-hour time, so these calculations would end up incorrect since your TimeUntil is actually lower than your TimeFrom.
Another approach would be (assuming you sort out the above issue) to store the time intervals as seconds using TIMESTAMPDIFF():
UPDATE my_table SET time_spent=TIMESTAMPDIFF(start, end));
SELECT SEC_TO_TIME(SUM(time_spent)) FROM my_table;
If the data type of the timeSpent column is TIME you should be able to use the following query:
SELECT SUM(timeSpent)
FROM YourTableName -- replace YourTableName with the actual table name
However, if that is not the case, you may have to use a cast to convert to the Time data type. Something like this should work:
SELECT SUM(timeSpent - CAST('0:0:0' as TIME))
FROM YourTableName -- replace YourTableName with the actual table name