Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SQL datetime字段获取特定时间后的记录_Sql_Sql Server_Datetime - Fatal编程技术网

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

如何使用SQL datetime字段获取特定时间后的记录,sql,sql-server,datetime,Sql,Sql Server,Datetime,如果我有一个datetime字段,我如何只获取晚于某个时间创建的记录,而完全忽略日期 这是一个日志表,它告诉人们何时在我们的应用程序中进行连接和操作。我想知道人们在下午5点以后上班的频率 (很抱歉,这是SQL Server。但这对其他人使用其他数据库可能很有用)我认为最好的办法是:不要使用DateTime字段;嗯,您可以使用大量的DATEADD/DATEPART等,但如果您有大量数据,则速度会很慢,因为它实际上无法在这里使用索引。您的数据库可能会以本机方式提供合适的类型(如SQL Server

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

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


(很抱歉,这是SQL Server。但这对其他人使用其他数据库可能很有用)

我认为最好的办法是:不要使用DateTime字段;嗯,您可以使用大量的DATEADD/DATEPART等,但如果您有大量数据,则速度会很慢,因为它实际上无法在这里使用索引。您的数据库可能会以本机方式提供合适的类型(如SQL Server 2008中的时间类型),但您也可以轻松地以分钟为单位存储时间偏移量(例如)。

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

对于甲骨文,你可以说

SELECT * FROM TABLE 
  WHERE TO_CHAR(THE_DATE, 'HH24:MI:SS') BETWEEN '17:00:00' AND '23:59:59';
此外,您可能需要滚动到第二天,并选择午夜到(比如)早上6点之间的时间。

对于SQL Server:

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

好的,我知道了

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

这将为我获取时间晚于下午5点的mydatefield记录。

另一种Oracle方法用于简单情况:

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


但有些问题很棘手,比如所有时间在15:03:21到15:25:45之间的记录。我还将在那里使用TO_CHAR方法。

在MySQL中,这将是

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

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

WHERE EXTEND(dt_column, HOUR TO SECOND) > DATETIME(17:00:00) HOUR TO SECOND
“EXTEND”确实可以压缩字段集(顾名思义,也可以扩展字段集)


正如Thilo所指出的,这是DBMS之间极易变化的一个领域(Informix肯定是其中一个变体)。

对于MSSQL,请使用转换方法:


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 

声明@TempDate datetime='2016年1月2日上午6:28:03'
挑选
@TempDate作为passedDate,
案例
转换时(nvarchar(30),@TempDate,108)<'06:30:00',然后是'6:30之前'
否则“早上6:30或之后”
完,,
案例
转换时(nvarchar(30),@TempDate,108)>='10:30:00',然后是'10:30am或之后'
否则“上午10:30前”
结束

你可能还想考虑一下早上的凌晨,包括早上6点之前的一些事情……在这种情况下,我不在乎,但是我可以看到,在其他情况下,我会考虑一些事情(我只是想知道人们一般什么时候出去,这样我们就可以安排一些数据库维护)。.此命令不会在午夜前1/2秒返回行。为什么不干脆>='17:00:00'.@Joe:实际上>='17:00:00'甚至>='17'也应该有效,我认为这只接受整小时,而不是“特定时间”,不应该是被接受的答案。