如何使用SQL datetime字段在一定时间后获取记录

时间:2008-10-06 23:30:07

标签: sql sql-server datetime

如果我有一个日期时间字段,如何只获取在特定时间之后创建的记录,而忽略完整的日期?

这是一个记录表,它告诉人们何时连接并在我们的应用程序中执行某些操作。我想知道人们在晚上5点以后的频率。

(抱歉 - 它是SQL Server。但这可能对其他人的其他数据库有用)

8 个答案:

答案 0 :(得分:18)

对于SQL Server:

select * from myTable where datepart(hh, myDateField) > 17

请参阅http://msdn.microsoft.com/en-us/library/aa258265(SQL.80).aspx

答案 1 :(得分:5)

您使用的是什么数据库系统?日期/时间功能差异很大。

对于Oracle,你可以说

SELECT * FROM TABLE 
  WHERE TO_CHAR(THE_DATE, 'HH24:MI:SS') BETWEEN '17:00:00' AND '23:59:59';

此外,您可能需要翻到第二天,并选择午夜和早上6点之间的时间。

答案 2 :(得分:4)

在MySQL中,这将是

where time(datetimefield) > '17:00:00'

答案 3 :(得分:1)

我能想到的最好的事情是:不要使用DateTime字段;好吧,你可以使用很多DATEADD / DATEPART等,但是如果你有很多数据它会很慢,因为它不能真正使用索引。您的数据库可以本机提供合适的类型 - 例如SQL Server 2008中的TIME类型 - 但您可以轻松地以分钟为单位存储时间偏移(例如)。

答案 4 :(得分:1)

对于MSSQL,使用CONVERT方法:


DECLARE @TempDate   datetime = '1/2/2016 6:28:03 AM'
SELECT  
    @TempDate as PassedInDate,  
    CASE 
        WHEN CONVERT(nvarchar(30), @TempDate, 108) < '06:30:00' then 'Before 6:30am'
        ELSE 'On or after  6:30am'
    END,
    CASE 
        WHEN CONVERT(nvarchar(30), @TempDate, 108) >= '10:30:00' then 'On or after 10:30am'
        ELSE 'Before 10:30am'
    END 

答案 5 :(得分:0)

好的,我知道了。

select myfield1, 
       myfield2, 
       mydatefield
  from mytable
 where datename(hour, mydatefield) > 17

这将使我获得mydatefield的记录,时间晚于下午5点。

答案 6 :(得分:0)

针对简单情况的另一种Oracle方法:

select ...
from   ...
where  EXTRACT(HOUR FROM my_date) >= 17
/

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions050.htm#SQLRF00639

但是对于一些问题很棘手,就像15:03:21到15:25:45之间的所有记录一样。我也在那里使用TO_CHAR方法。

答案 7 :(得分:0)

在Informix中,假设你使用DATETIME YEAR TO SECOND字段来保存完整日期,你会写:

WHERE EXTEND(dt_column, HOUR TO SECOND) > DATETIME(17:00:00) HOUR TO SECOND

'EXTEND'确实可以收缩字段集(以及扩展它,顾名思义)。

正如Thilo所指出的,这是DBMS之间极端可变的区域(而Informix肯定是变体之一)。