如果我有一个日期时间字段,如何获取晚于特定时间创建的记录,完全忽略日期?
它是一个日志表,它告诉人们何时在我们的应用程序中进行连接和执行某些操作。我想了解人们在下午 5 点之后上线的频率。
(抱歉 - 它是 SQL Server。但这对其他人使用其他数据库可能有用)
对于 SQL Server:
SELECT * FROM myTable WHERE DATEPART(hh, myDateField) > 17
请参阅 http://msdn.microsoft.com/en-us/library/aa258265(SQL.80).aspx。
您使用什么数据库系统?日期/时间函数差异很大。
对于 Oracle,你可以说
SELECT * FROM TABLE
WHERE TO_CHAR(THE_DATE, 'HH24:MI:SS') BETWEEN '17:00:00' AND '23:59:59';
此外,您可能需要滚动到第二天,并选择午夜到早上 6 点之间的时间。
在 MySQL 中,这将是
where time(datetimefield) > '17:00:00'
我能想到的最好的事情是:不要使用 DateTime 字段;好吧,你可以使用很多 DATEADD/DATEPART 等,但是如果你有很多数据,它会很慢,因为它不能真正使用索引。您的数据库可能本身提供合适的类型 - 例如 SQL Server 2008 中的 TIME 类型 - 但您也可以轻松地以分钟为单位存储时间偏移(例如)。
对于 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
针对简单情况的另一种 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 方法。
在 Informix 中,假设您使用 DATETIME YEAR TO SECOND 字段来保存完整日期,您可以编写:
WHERE EXTEND(dt_column, HOUR TO SECOND) > DATETIME(17:00:00) HOUR TO SECOND
“EXTEND”确实可以收缩字段集(以及扩展它,顾名思义)。
正如 Thilo 所指出的,这是 DBMS 之间存在极大差异的领域(Informix 无疑是其中之一)。
好的,我明白了。
select myfield1,
myfield2,
mydatefield
from mytable
where datename(hour, mydatefield) > 17
这将为我获取 mydatefield 时间晚于下午 5 点的记录。