Scott Abraham
asked on
SQL Query Select time within last hour.
I have the following query:
SELECT Vehicle_ID
, Alias
, Day
, Month
, Year
, GPSTime
, Date_Time
, PC_Date
, PC_Time
, Street
, City
, State
, Zip_Code
, Latitude
, Longitude
, Speed
, Course
, Altitude
, Event
, Advisory_Event
FROM dbo.VehicleState
WHERE (Latitude IS NOT NULL)
The Alias is our trucks, of which we have about 25 of them. They report in a postion, date and time. I want to take and select the record that reflects the last time within the last hour that each truck has reported in. I had this working through Access, but my SQL-Fu is not enough to do it in SQL 2012. Any help is appreciated.
SELECT Vehicle_ID
, Alias
, Day
, Month
, Year
, GPSTime
, Date_Time
, PC_Date
, PC_Time
, Street
, City
, State
, Zip_Code
, Latitude
, Longitude
, Speed
, Course
, Altitude
, Event
, Advisory_Event
FROM dbo.VehicleState
WHERE (Latitude IS NOT NULL)
The Alias is our trucks, of which we have about 25 of them. They report in a postion, date and time. I want to take and select the record that reflects the last time within the last hour that each truck has reported in. I had this working through Access, but my SQL-Fu is not enough to do it in SQL 2012. Any help is appreciated.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
I got the following error:
Arithmetic overflow error converting expression to data type datetime.
I looked at our vendors table and they have date_time as an INT, and not DATETIME. So I tried cast ( date_time as datetime) but still same error.
Arithmetic overflow error converting expression to data type datetime.
I looked at our vendors table and they have date_time as an INT, and not DATETIME. So I tried cast ( date_time as datetime) but still same error.
does GPSTime work or is that another int?
If [date_time] and [GPS_time] are integre then one converts getdate() to int for the comparisons to work.
You mention SQL 2012, so you can use format()
e.g.
FORMAT(GETDATE(), 'yyyyMMddHHmmss')
and:
cast(FORMAT(GETDATE(), 'yyyyMMddHHmmss') as bigint)
cast(FORMAT(GETDATE(), 'yyyyMMddHHmm') as bigint)
You don't indicate how large the [date_time] or [GPS_time] values are. I have gone down to seconds in the example above (14 digits) and this requires bigint. Removing 'ss' would result in minute precision and 12 digits still needing bigint.
If [date_time] or [GPS_time] values are only 8 digits then you cannot determine "in the last hour" from that/those field/s.
You mention SQL 2012, so you can use format()
e.g.
FORMAT(GETDATE(), 'yyyyMMddHHmmss')
and:
cast(FORMAT(GETDATE(), 'yyyyMMddHHmmss') as bigint)
cast(FORMAT(GETDATE(), 'yyyyMMddHHmm') as bigint)
You don't indicate how large the [date_time] or [GPS_time] values are. I have gone down to seconds in the example above (14 digits) and this requires bigint. Removing 'ss' would result in minute precision and 12 digits still needing bigint.
If [date_time] or [GPS_time] values are only 8 digits then you cannot determine "in the last hour" from that/those field/s.
You'd have to give some examples of int datetimes and the corresponding calendar datetime.
ASKER
Example of all date related info from DB for one row.
Date_Time:
1383595291 int
PC_date:
2013-11-04 varchar(12)
PC_Time:
14:01:33 char(8)
Day:
4 smallint
Month:
11 smallint
Year:
2013 smallint
GPSTime:
50491 float
Date_Time:
1383595291 int
PC_date:
2013-11-04 varchar(12)
PC_Time:
14:01:33 char(8)
Day:
4 smallint
Month:
11 smallint
Year:
2013 smallint
GPSTime:
50491 float
How do you know that 1383595291 = 11/04/2013?
I thought it was a Julian date but it's not working. Have you worked with that datetime column in the past?
I thought it was a Julian date but it's not working. Have you worked with that datetime column in the past?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
suggested reading:
DATE and TIME ... don't be scared, and do it right (the first time)
DATE and TIME ... don't be scared, and do it right (the first time)
ASKER
Thanks!! Based off two posts here is the solution I came up with:
SELECT [Vehicle_ID]
,[Day]
,[Month]
,[Year]
,[GPSTime]
,[Date_Time]
,[PC_Date]
,[PC_Time]
,[Latitude]
,[Longitude]
,[Speed]
,[Course]
,dateadd(second,GPSTime,PC _date) as GPS_Time
FROM [Integrator].[dbo].[Vehicl eState]
WHERE LATITUDE > 0 AND dateadd(second,GPSTime,PC_ date) >= dateadd(hh, -1, getdate())
GROUP BY [Vehicle_ID]
,[Day]
,[Month]
,[Year]
,[GPSTime]
,[Date_Time]
,[PC_Date]
,[PC_Time]
,[Latitude]
,[Longitude]
,[Speed]
,[Course]
,dateadd(second,GPSTime,PC _date)
SELECT [Vehicle_ID]
,[Day]
,[Month]
,[Year]
,[GPSTime]
,[Date_Time]
,[PC_Date]
,[PC_Time]
,[Latitude]
,[Longitude]
,[Speed]
,[Course]
,dateadd(second,GPSTime,PC
FROM [Integrator].[dbo].[Vehicl
WHERE LATITUDE > 0 AND dateadd(second,GPSTime,PC_
GROUP BY [Vehicle_ID]
,[Day]
,[Month]
,[Year]
,[GPSTime]
,[Date_Time]
,[PC_Date]
,[PC_Time]
,[Latitude]
,[Longitude]
,[Speed]
,[Course]
,dateadd(second,GPSTime,PC
, Alias
, Day
, Month
, Year
, GPSTime
, Date_Time
, PC_Date
, PC_Time
, Street
, City
, State
, Zip_Code
, Latitude
, Longitude
, Speed
, Course
, Altitude
, Event
, Advisory_Event
FROM dbo.VehicleState
WHERE (Latitude IS NOT NULL) and Date_Time >= dateadd(hh, -1, getdate())
/* you said you want the latest . . . if there is more than one in the last our this needs to be included, otherwise you can remove below this and just keep the addition in the where condition */
group by Vehicle_ID
, Alias
, Day
, Month
, Year
, GPSTime
, Date_Time
, PC_Date
, PC_Time
, Street
, City
, State
, Zip_Code
, Latitude
, Longitude
, Speed
, Course
, Altitude
, Event
, Advisory_Event
having Date_Time = max(date_time)