如何在Oracle中过滤特定时间段

时间:2018-10-18 16:40:46

标签: oracle date select filter

我有一个格式为'5/23/2018 3:35:18 PM'的日期和时间列(Login_time)。我想用6.30 to 7.30的八月月份和时间段来过滤行。我可以使用Login_time >= to_date('08/1/2018','MM/DD/YYYY') and Login_time >= to_date('08/31/2018','MM/DD/YYYY')过滤八月,但是现在我只希望行在6.30 am到7.30 am之间。

4 个答案:

答案 0 :(得分:2)

您可以将列的时间部分格式化为字符串,然后用词汇进行比较:

TO_CHAR(login_time, 'HH24:MI:SS') BETWEEN '06:30:00' AND '07:30:00' 

答案 1 :(得分:2)

请注意日期/时间范围。您通常希望包括开始时间,但不包括结束时间,例如从2018-08-01到2018-09-01之前的所有行,因此包括整天的最后一行,无论离午夜有多近。这是整个查询:

Master.dropna()  
Master.to_csv(filename)

答案 2 :(得分:1)

您只需输入时间:

Login_time >= to_date('08/01/2018 06:30:00','MM/DD/YYYY HH24:MI:SS') 
 and Login_time <= to_date('08/31/2018 07:30:59','MM/DD/YYYY HH24:MI:SS') 
  and to_char(login_time, 'hh24:mi:ss') >= '06:30:00'
  and to_char(login_time, 'hh24:mi:ss') <= '07:30:59'

EXTRACT(MONTH FROM CAST(Login_time AS TIMESTAMP)) = 8 
  and to_char(login_time, 'fmSSSSS') between 6*60*60 + 30*60 AND 7*60*60 + 30*60 

答案 3 :(得分:0)

我对“ 6:30 AM和7:30 AM之间”的要求采取了不同的方法。在此答案中,我减去30分钟,然后检查小时值是6还是7。我选择此方法作为字符串比较的一种变体。我不知道它的效果是否更好,但这是另一种方法。必须转换为时间戳才能提取小时值。

 WHERE trunc(login_time) BETWEEN to_date('8/1/2018', 'mm/dd/yyyy') AND to_date('8/31/2018', 'mm/dd/yyyy')
   AND extract(hour FROM cast(login_time-(30/60/24) as timestamp)) IN (6,7)

如果您总是要查询整个月,则可以缩短为

 WHERE trunc(login_time, 'MONTH') = to_date('8/1/2018', 'mm/dd/yyyy')
   AND extract(hour FROM cast(login_time-(30/60/24) as timestamp)) IN (6,7)