2014-02-03 3 views
0

Не могли бы вы помочь мне со следующим запросом?SQL Server 2008: DateDiff() из Min()/Max() не работает

Моя цель:

В течение каждого дня и для каждого сотрудника выбрать минимальную DateTime и максимальную DateTime и получить разницу во времени в минутах

Мой запрос:

SELECT 
    PersonalId, Name, LastName, 
    Min(TmsPrick) as MinDatetime, 
    Max(TmsPrick) as MaxDatetime, 
    DATEDIFF(mi, MIN(TmsPrick), MAX(TmsPrick)) AS Expr1 
FROM 
    prickTable 
GROUP BY 
    DATEPART(dy, TmsPrick), PersonalId, name, lastname, TmsPrick 
ORDER BY 
    PersonalId, TmsPrick 

Примечание: DATEPART (dy, TmsPrick) = День года

Мой ожидаемый выход

PersonalId | Name  | LastName | MinDatetime  | MaxDatetime  | Expr1 
    ------------------------------------------------------------------------------------ 
    000001 | A   | AC   |2014-01-05 07:12:00|2014-01-05 16:00:00 | 528 
    000001 | A   | AC   |2014-01-06 07:08:00|2014-01-05 16:00:00 | 532 
    000001 | A   | AC   |2014-01-07 07:11:00|2014-01-07 16:00:00 | 529 
    000002 | B   | BD   |2014-01-05 07:11:00|2014-01-05 16:00:00 | 529 

Выход я получаю:

PersonalId | Name  | LastName | MinDatetime  | MaxDatetime  | Expr1 
    ------------------------------------------------------------------------------------ 
    000001 | A   | AC   |2014-01-05 07:12:00|2014-01-05 16:00:00 | 1053168 
    000001 | A   | AC   |2014-01-06 07:08:00|2014-01-05 16:00:00 | 532 
    000001 | A   | AC   |2014-01-07 07:11:00|2014-01-07 16:00:00 | 529 
    000002 | B   | BD   |2014-01-05 07:11:00|2014-01-05 16:00:00 | 1053169 

Любая идея, почему мой вывод показывает такие различия?

Благодаря

Примечание: Значения в Tmsprick могут варьироваться от нескольких в день до 2 в неделю. Таблица содержит значения от более 3 лет.

+0

ГРУППА ПО DATEPART (dy, TmsPrick) ?? – Miller

+2

Ну, для начала, почему вы не используете те же столбцы, на которых вы рассчитали дату «MAX» и «MIN» ?. Для тех, кого вы используете 'TmsPrick', и для разницы в минутах вы используете' tijdstip' – Lamak

+0

@Lamak. Хорошая точка зрения. Я изменил названия колонок с голландского несколько более английского. Но я, кажется, забыл некоторые имена. Изменится em напрямую – User999999

ответ

1

Я подозреваю, что запрос, который вы хотите :

SELECT PersonalId, Name, LastName, 
     Min(TmsPrick) as Mintime, Max(TmsPrick) as Maxtime, 
     DATEDIFF(mi, MIN(TmsPrick), MAX(TmsPrick)) AS Expr1 
FROM prickTable 
GROUP BY PersonalId, name, lastname, cast(TmsPrick as date) 
ORDER BY PersonalId, max(TmsPrick); 

Это даст на «истекшее время» на каждый день, потому что первый и последний «tmsprick».

+0

совершенно блестящий! Спасибо, я владею вами. Выход прекрасен прямо сейчас! :) – User999999

3

Ну, не видя исходные данные, трудно знать наверняка, но вы используете различные столбцы даты в MAX/MIN и DATEDIFF:

SELECT 
    PersonalId, 
    Name, 
    LastName, 
    Min(TmsPrick) as MinDatetime, 
    Max(TmsPrick) as MaxDatetime , 
    DATEDIFF(mi, MIN(tijdstip), MAX(tijdstip)) AS Expr1 
        ^-- should be TmsPrick? 
+1

Кроме того, запрос агрегируется с помощью 'TmsPrick' и включает в себя команды' min() 'и' max() '. –

+0

Изменено в описании проблемы. +1 хотя для того, чтобы указать на это! – User999999

Смежные вопросы