Невозможно получить минимальное и максимальное время из столбца Datetime для каждого дня - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь получить MIN и MAX время из столбца Datetime (InOut), но вывод одинаков для обоих столбцов.

Мой запрос:

SELECT
  CONVERT(NVARCHAR(12),MIN(Punch_history.Ecode)) as EmpCode,
  CONVERT(NVARCHAR(12),MIN(EmployeeMaster.RecommandedBy)) as EmpID,
  convert(date, InOut) as Report_date,
  CONVERT(VARCHAR(10),(InOut),108) as InTime,
  CONVERT(VARCHAR(10),(InOut),108) as OutTime,
  CONVERT(NVARCHAR(12),MIN(TID)) as LOCATION
  FROM Punch_history inner join EmployeeMaster on Punch_history.ECode = EmployeeMaster.Ecode
  where CAST (InOut as DATE) between  CAST(getdate() -1 as DATE ) and CAST(getdate() -1 as DATE ) and 
  EmployeeMaster.RecommandedBy like 'M0%' group by EmpID,InOut

enter image description here

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

В дополнение к проблеме группирования предложение where довольно странное.Прежде всего, использование ярлыков для математики даты - это беспроигрышная ситуация.Это не удастся с datetime2.И использование между двумя одинаковыми значениями просто странно.

SELECT
    CONVERT(NVARCHAR(12), MIN(Punch_history.Ecode)) as EmpCode,
    convert(date, MIN(InOut)) as Report_date,
    CONVERT(NVARCHAR(10), min(InOut), 108) as InTime,
    CONVERT(NVARCHAR(10), max(InOut), 108) as OutTime
FROM Punch_history 
where convert(date, InOut) = convert(date, dateadd(day, -1, getdate()))
group by EmpID
0 голосов
/ 05 июня 2018

Основная проблема заключается в том, что вы не должны группировать по InOut (datetime), поэтому в результате max и min совпадают.На самом деле, это отменяет группировку, которую вы хотите выполнять ежедневно.

  SELECT
  CONVERT(NVARCHAR(12),MIN(Punch_history.Empcode)) as EmpCode,
  CONVERT(DATE , Max(InOut)) as Report_date,
  CONVERT(NVARCHAR(10),min(InOut),108) as InTime,
  CONVERT(NVARCHAR(10),max(InOut),108) as OutTime
  FROM Punch_history 
  where datediff(day, CAST(InOut as DATE ) , CAST(getdate() as DATE ) )=1
  group  by EmpID

Кроме того, если empid и empcode равны 1-1 (по логике, они должны быть), то вы можете группировать напрямую с помощью empcode, или оба они избегают этого довольно странного значения Min (empcode).

0 голосов
/ 05 июня 2018

Попробуйте сгруппировать по конвертированной дате вместо inout.

SELECT
  CONVERT(NVARCHAR(12),MIN(Punch_history.Ecode)) as EmpCode,
  convert(date, InOut) as Report_date,
  CONVERT(NVARCHAR(10),min(InOut),108) as InTime,
  CONVERT(NVARCHAR(10),max(InOut),108) as OutTime
  FROM Punch_history 
  where CAST (InOut as DATE) between  CAST(getdate() -1 as DATE ) 
    and CAST(getdate() -1 as DATE ) 
  group by EmpID, convert(date, InOut)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...