【问题标题】:Datetime help in MySQLMySQL 中的日期时间帮助
【发布时间】:2014-06-10 08:19:01
【问题描述】:

请帮助我。 我有如下数据。 现在我想根据给定的 dataetime 显示在商店的员工。 在这里,emp 早上 9 点来,11 点离开。他又在 12.30 pm 上班,19 点离开。我将数据时间设为2014-05-15 09:15:45。 对于这一次 员工在商店,但我无法获取数据。

但我无法获取数据。 请帮帮我

Empno        ClockDate        ClockTime                ClockType 
1            2014-05-15       2014-05-15 09:00:00       I 
1            2014-05-15       2014-05-15 11:00:00       O 
1            2014-05-15       2014-05-15 12:30:00       I 
1            2014-05-15       2014-05-15 19:00:00       O 

这是我的查询:

SELECT DISTINCT a.emp_a, 
                clock_date_1, 
                a.clock_time, 
                b.clock_time 
FROM   (SELECT MAX(clock_time) clock_time, 
               employee_no     AS emp_a, 
               clock_date      clock_date_1 
        FROM   clock_time 
        WHERE  clock_type = 'I' 
        GROUP  BY clock_type, 
                  emp_a, 
                  clock_date)a, 
       (SELECT MAX(clock_time) clock_time, 
               employee_no     AS emp_b 
        FROM   clock_time 
        WHERE  clock_type = 'O' 
        GROUP  BY clock_type, 
                  emp_b)b 
WHERE  '2014-05-23 09:15:45' BETWEEN a.clock_time AND b.clock_time 
       AND a.emp_a = b.emp_b 
       AND a.emp_a = 1 

【问题讨论】:

  • 这个问题缺乏足够的信息来诊断问题。考虑与所需的结果集一起提供适当的 DDL(和/或 sqlfiddle)。
  • 嗨草莓,考虑上表。我有这样的数据。现在我需要在 '2014-05-23 09:15:45' 时间获取 empid 1 信息的数据。如果他在我给定的时间内有空,我的查询必须显示 emp 数据。但是根据我的查询 inpt time hes theres in store.But 我无法获取数据。请帮忙
  • 我将 OP 参考我刚才提供的评论。
  • 为什么会有一个与DATE(clock_time) 等效的clock_date 字段?

标签: mysql date datetime


【解决方案1】:

表中的 ClockDate 是 2014-05-15,而 where 子句中的 ClockDate 是 2014-05-23。根据上面的数据,在您查询时,他似乎没有在商店中。

【讨论】:

  • 对不起,where 子句中的数据仅为 2014-05-15
【解决方案2】:

似乎有一个逻辑错误。

您必须获取输入日期下方的clock_type='I''MAX' 日期和输入日期上方的clock_type='O''MIN' 日期。

示例

set @inputDateTime := '2014-05-15 09:15:45';

SELECT DISTINCT a.emp_a, clock_date_1, a.clock_time, b.clock_time 
  FROM ( SELECT MAX(clock_time) clock_time
              , employee_no AS emp_a
              , clock_date clock_date_1 
           FROM clock_time 
          WHERE clock_type='I' 
            AND clock_time <= @dt
          GROUP BY /*clock_type,*/ emp_a, clock_date 
       ) a, 
       ( SELECT MIN(clock_time) clock_time
              , employee_no AS emp_b 
           FROM clock_time 
          WHERE clock_type='O' 
            AND clock_time >= @dt
          GROUP BY /*clock_type, */ emp_b, clock_date
       ) b 
 WHERE @inputDateTime BETWEEN a.clock_time AND b.clock_time 
   AND a.emp_a = b.emp_b 
   AND a.emp_a=1
;

【讨论】:

  • 嗨 Ravinder,我尝试了您的查询,但如果我给出 inputDateTime := '2014-05-15 11:15:45' 则显示数据。但此时员工不在办公室。请帮助
【解决方案3】:

如果您有一个大型数据集,这可能不是最有效的查询,但不妨试一试:

SELECT employee_no, clock_date, clock_time AS clock_in,
    (SELECT MIN(clock_time)
     FROM clock_time
     WHERE clock_type = 'O'
     AND employee_no = c.employee_no
     AND clock_time >= c.clock_time) AS clock_out
FROM clock_time c
WHERE clock_type = 'I';

获得这种格式的数据后,您应该可以根据需要添加WHERE(或HAVING)和GROUP BY

示例表数据:

employee_no  clock_time           clock_type  clock_date  
-----------  -------------------  ----------  ------------
          1  2014-01-01 12:00:00  I           2014-01-01  
          1  2014-01-01 12:30:00  O           2014-01-01  
          1  2014-01-01 12:40:00  I           2014-01-01  
          1  2014-01-01 13:00:00  O           2014-01-01  
          2  2014-01-01 13:20:00  I           2014-01-01  
          2  2014-01-01 14:20:00  O           2014-01-01  
          2  2014-01-01 14:40:00  I           2014-01-01  
          2  2014-01-01 14:50:00  O           2014-01-01  
          2  2014-01-02 12:00:00  I           2014-01-02  
          2  2014-01-02 12:30:00  O           2014-01-02  
          2  2014-01-03 12:40:00  I           2014-01-03  
          2  2014-01-03 13:00:00  O           2014-01-03  

查询输出:

employee_no  clock_date  clock_in             clock_out            
-----------  ----------  -------------------  ---------------------
          1  2014-01-01  2014-01-01 12:00:00  2014-01-01 12:30:00  
          1  2014-01-01  2014-01-01 12:40:00  2014-01-01 13:00:00  
          2  2014-01-01  2014-01-01 13:20:00  2014-01-01 14:20:00  
          2  2014-01-01  2014-01-01 14:40:00  2014-01-01 14:50:00  
          2  2014-01-02  2014-01-02 12:00:00  2014-01-02 12:30:00  
          2  2014-01-03  2014-01-03 12:40:00  2014-01-03 13:00:00  

注意:以上逻辑假设单个员工不能有重叠签到。

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 2013-09-29
    • 2023-04-08
    • 2012-06-13
    • 2012-05-07
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    相关资源
    最近更新 更多