• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 379
  • Last Modified:

sql server - how to query specific time - T SQL

I have a timestamp field.
I need to query all the records for the hour.. A record for 1,2,3 o'clock.
The data looks like

2012-11-01 01:00:00
2012-11-01 01:15:00
2012-11-01 01:45:00
2012-11-01 02:00:00
2012-11-01 02:15:00
2012-11-01 03:00:00

How do query for the full hour?
0
JElster
Asked:
JElster
1 Solution
 
Steve WalesSenior Database AdministratorCommented:
This will give you the basic structure of the query:

select * from your_table
where column_name between convert(datetime, '2012-11-01 01:00:00', 120) and convert(datetime, '2012-11-01 02:00:00', 120)
0
 
Dale FyeCommented:
Just so you understand, a TimeStamp field is not the same as a Date/Time field.  According to Microsoft:

"It is used as a mechanism for version-stamping table rows. The storage size is 8 bytes. The timestamp data type is just an incrementing number and does not preserve a date or a time. To record a date or time, use a datetime data type."
0
 
JElsterAuthor Commented:
It's not a timestamp field... sorry for the confusion
Just a DATETIME
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
Scott PletcherSenior DBACommented:
Most important are:
1) not to perform any function on the column itself
2) not to count the same row more than once


I strongly recommend the style below for ALL date/datetime checks:

--query for 1AM rows only
WHERE
    datetime_column >= '20121101 01:00:00' AND
    datetime_column <  '20121101 02:00:00'


Leaving out the dashes prevents any conversion errors ('YYYYMMDD' is always interpreted correctly) and/or misunderstandings about what the date value represents.

Using >= and < rather than between avoids counting rows on the exact hour twice.
0
 
JElsterAuthor Commented:
But I have many dates!



What about this...
First

SUBSTRING( CONVERT(nvarchar(30), TIMESTAMP, 120),15,5) AS DT

then

select ....   WHERE DT = '00:00'
0
 
Scott PletcherSenior DBACommented:
If you just want to group a lot of rows by their hours only, ignoring dates, do as below.

Yes, it uses a function on the column, but when you want all values you have to:


SELECT
    HOUR(TIMESTAMP) AS HR,
    ...
FROM dbo.tablename
--OPTIONAL!: for example, all records for current year only
--WHERE
    --TIMESTAMP >= '20120101' AND TIMESTAMP < '20130101'
GROUP BY
    HOUR(TIMESTAMP)
ORDER BY
    HOUR(TIMESTAMP)



If you want to see days, but only one row per hour per day, you can do this:

SELECT
    DATEADD(HOUR, DATEDIFF(HOUR, 0, TIMESTAMP), 0) AS DT,
    ...
FROM dbo.tablename
--OPTIONAL!: for example, all records for current year only
--WHERE
    --TIMESTAMP >= '20120101' AND TIMESTAMP < '20130101'
GROUP BY
    DATEADD(HOUR, DATEDIFF(HOUR, 0, TIMESTAMP), 0)
ORDER BY
    DATEADD(HOUR, DATEDIFF(HOUR, 0, TIMESTAMP), 0)
0

Featured Post

 [eBook] Windows Nano Server

Download this FREE eBook and learn all you need to get started with Windows Nano Server, including deployment options, remote management
and troubleshooting tips and tricks

Tackle projects and never again get stuck behind a technical roadblock.
Join Now