20

如果我有一个日期时间字段,我如何只获得晚于某个时间创建的记录,而完全忽略日期?

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

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

4

8 回答 8

20

对于 SQL Server:

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

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

于 2008-10-06T23:36:48.763 回答
7

你用的是什么数据库系统?日期/时间函数变化很大。

对于甲骨文,你可以说

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

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

于 2008-10-06T23:36:08.623 回答
4

在 MySQL 中,这将是

where time(datetimefield) > '17:00:00'
于 2008-10-07T02:19:39.590 回答
1

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

于 2008-10-06T23:35:26.923 回答
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 
于 2016-07-12T18:35:57.127 回答
0

好的,我明白了。

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

这将使我在下午 5 点之后获得带有 mydatefield 的记录。

于 2008-10-06T23:37:12.380 回答
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 方法。

于 2008-10-07T01:35:21.707 回答
0

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

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

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

正如 Thilo 所指出的,这是 DBMS 之间存在极大差异的一个领域(Informix 肯定是其中一种变体)。

于 2008-10-10T21:51:59.270 回答