Sql TRANSFORM со временем расчета в MS Access

Я пытаюсь сделать Sql TRANSFORM со временем расчета в столбце и обратно.

Мне нужен ответ в 1 запросе, и я не хочу использовать эту функцию в доступе к MS, потому что я хочу использовать sql в vb.net

Пожалуйста, направь меня

Спасибо

Стол ABSEN

ДАТА ВРЕМЯ ВХОД СТАТУС РАСПОЛОЖЕНИЕ 26 августа 24 08:00:00 В ПОДАРОК БОДЖОНГ 26 августа 24 17:00:00 ВНЕ ПОДАРОК БОДЖОНГ 27-24 августа 08:00:00 В ПОДАРОК БОДЖОНГ 27-24 августа 17:00:00 ВНЕ ПОДАРОК БОДЖОНГ 28 августа 24 г. 08:00:00 В ПОДАРОК БОДЖОНГ 28 августа 24 г. 17:00:00 ВНЕ ПОДАРОК БОДЖОНГ 29-24 августа 08:00:00 В ПОДАРОК БОДЖОНГ 29-24 августа 17:00:00 ВНЕ ПОДАРОК БОДЖОНГ 30 августа 24 г. 08:00:00 В ПОДАРОК БОДЖОНГ 30 августа 24 г. 17:00:00 ВНЕ ПОДАРОК БОДЖОНГ 31 августа 24 г. 08:20:00 В ПОДАРОК БОДЖОНГ 31 августа 24 г. 17:00:00 ВНЕ ПОДАРОК БОДЖОНГ 01 сентября 24 г. 0 В НЕТ БОДЖОНГ 01 сентября 24 г. 0 ВНЕ НЕТ БОДЖОНГ

Стол MASTERDAYS

РАСПОЛОЖЕНИЕ ДЕНЬ РАЗМОРАЖИВАНИЕ ОПРЕДЕЛИТЬ БОДЖОНГ Понедельник 01:00:00 08:00:00 БОДЖОНГ Вторник 01:00:00 08:00:00 БОДЖОНГ Среда 01:00:00 08:00:00 БОДЖОНГ Четверг 01:00:00 08:00:00 БОДЖОНГ Пятница 01:30:00 08:00:00 БОДЖОНГ Суббота 01:00:00 08:00:00 БОДЖОНГ Воскресенье 00:00:00 00:00:00
TRANSFORM Max(ABSEN.Time) AS MaxOfTIME
SELECT ABSEN.Date AS [DATE], 
       Format(ABSEN.Date,'dddd') AS DAYS, 
       ABSEN.STATUS AS STATUS, 
       IIF(ABSEN.STATUS = 'NOT PRESENT', '',MASTERDAYS.DEFREST) AS DEFREST
FROM ABSEN INNER JOIN MASTERDAYS AS MASTERDAYS ON (MASTERDAYS.DAY = FORMAT(ABSEN.DATE,'dddd')) AND (MASTERDAYS.LOCATION = ABSEN.LOCATION)
GROUP BY ABSEN.Date, 
         Format(ABSEN.Date,'dddd'), 
         ABSEN.STATUS, MASTERDAYS.DEFREST
PIVOT ABSEN.INOUT In ('IN','OUT');

Результат из кода

ДАТА ДНИ СТАТУС РАЗМОРАЖИВАНИЕ В ВНЕ 26 августа 24 Понедельник ПОДАРОК 01:00:00 08:00:00 17:00:00 27-24 августа Вторник ПОДАРОК 01:00:00 08:00:00 17:00:00 28 августа 24 г. Среда ПОДАРОК 01:00:00 08:00:00 17:00:00 29-24 августа Четверг ПОДАРОК 01:00:00 08:00:00 17:00:00 30 августа 24 г. Пятница ПОДАРОК 01:30:00 08:00:00 17:00:00 31 августа 24 г. Суббота ПОДАРОК 01:30:00 08:00:00 17:00:00 01 сентября 24 г. Воскресенье НЕТ 0 0

Желаемый результат

DUROFWORK = (ABSEN.Time IN - ABSEN.Time OUT - MASTERDAYS.DEFREST) LATEIN = (ОТСУТСТВИЕ.ВРЕМЯ ВХ. - MASTERDAYS.DEFIN)

Для статуса NOT PRESENT хочу сделать заготовку для DEFREST,IN,OUT,DUROFWORK,LATEIN

ДАТА ДНИ СТАТУС РАЗМОРАЖИВАНИЕ В ВНЕ ДЮРОФВОРК ЛАТЕИН 26 августа 24 Понедельник ПОДАРОК 01:00:00 08:00:00 17:00:00 08:00:00 27-24 августа Вторник ПОДАРОК 01:00:00 08:00:00 17:00:00 08:00:00 28 августа 24 г. Среда ПОДАРОК 01:00:00 08:00:00 17:00:00 08:00:00 29-24 августа Четверг ПОДАРОК 01:00:00 08:00:00 17:00:00 08:00:00 30 августа 24 г. Пятница ПОДАРОК 01:30:00 08:00:00 17:00:00 07:30:00 31 августа 24 г. Суббота ПОДАРОК 01:30:00 08:00:00 17:00:00 06:10:00 00:20:00 01 сентября 24 г. Воскресенье НЕТ
Info data type 

Public Class DTOABSENTRANSFORMREPORT
    Public Property [DATE] As DateTime
    Public Property DAYS As String
    Public Property STATUS As String
    Public Property DEFREST As String
    Public Property TIME As String
    Public Property [IN] As String
    Public Property OUT As String
    Public Property DUROFWORK As String
    Public Property LATEIN As String
End Class

Всегда ли это 1 вход и 0–1 выход в день для каждой локации? Есть ли в этом еще и «человек»?

tinazmu 27.08.2024 06:49

Вы создаете записи в Абсене за неявку? Почему Абсен показывает НАСТОЯЩЕЕ в воскресенье? Доступ читает 0 раз как 00:00:00.

June7 27.08.2024 07:08

@tinazmu, Is it always 1 IN and 0-1 OUT per day, per location? Ты прав, в день всегда 1 вход и 1 выход. Is there also a 'person' involved? Ты имеешь в виду, что люди определенно участвуют и выходят за 1 день

dlaksmi 27.08.2024 07:13

Так нужно делать расчеты на человека? Почему ваши выборочные данные этого не отражают?

June7 27.08.2024 07:17

@June7, извини, это опечатка. Access reads 0 time as 12:00:00 AM.И что мне делать?

dlaksmi 27.08.2024 07:17

@June7 So need to do calculations per person? Why does your sample data not reflect this? как я могу рассчитать время с помощью Transform Pivot sql, пожалуйста, помогите мне

dlaksmi 27.08.2024 07:19

Варианты борьбы с 0 раз; 1) оставить поле NULL; 2) не создавать записи о неявке; 3) IIf() Calc, с которым нужно иметь дело (что вы, кажется, и делаете).

June7 27.08.2024 07:28

Почему в каждой строке результатов указано 26 августа?

tinazmu 27.08.2024 07:58

@tinazmu, извини, это опечатка

dlaksmi 27.08.2024 08:30
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
9
88
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что используя TRANSFORM (PIVOT), придется выполнить последующий запрос для расчета разницы.

Доступ читает 0 раз как 00:00:00. Для упрощения я удалил данные о времени из воскресных записей.

Рассмотрим этот подход:

SELECT Absen.Date, Absen.Status, Absen.Location, MasterDays.Day, MasterDays.Defin, 
MasterDays.Defrest, Max(IIf([InOut] = "IN",[Time])) AS [IN], 
Max(IIf([InOut] = "OUT",[Time])) AS Out, 
Format([OUT]-[IN]-Defrest,"hh:mm:ss") AS DurOfWork, 
Format([IN]-Defin, "hh:mm:ss") AS LateIn
FROM MasterDays INNER JOIN Absen ON MasterDays.Location = Absen.Location
AND (MASTERDAYS.DAY = FORMAT(ABSEN.DATE,'dddd'))
GROUP BY Absen.Date, Absen.Status, Absen.Location, MasterDays.Day, MasterDays.Defin, MasterDays.Defrest;

спасибо за ответ. Ваш ответ очень простой, но почему такой результат DurOfWork and LateIn #error

dlaksmi 27.08.2024 09:56

Я не получил #error в своем тесте.

June7 27.08.2024 10:24

для столбца TIME я использую данные типа Text / String

dlaksmi 27.08.2024 10:31

Почему? Я использовал тип даты/времени.

June7 27.08.2024 10:36

имеет ли значение, использую ли я строковый тип и, возможно, такую ​​функцию datediff или другую

dlaksmi 27.08.2024 10:40

для упрощения записи я могу поставить 0 в столбце «Вход» и «Выход». Пожалуйста, направь меня

dlaksmi 27.08.2024 10:41

Строку необходимо преобразовать в значение даты/времени в Calc. DateDiff() выполнит неявное преобразование.

June7 27.08.2024 10:59

пожалуйста, помогите мне, я также обновил тип данных в сообщении, чтобы было проще

dlaksmi 27.08.2024 12:04
Ответ принят как подходящий

Если вы можете отказаться от использования TRANSFORM; тогда вы можете использовать что-то вроде:

SELECT 
    AIn.Date AS [DATE]
  , MD.day AS [Day of Week]
  , MI.NAMEID
  , AIn.status
  , IIF(AIn.STATUS = 'NOT PRESENT', '',MD.DEFREST) AS DEFREST
  , IIF(AIn.STATUS = 'NOT PRESENT', '',AIn.TIME) AS [IN]
  , IIF(AIn.STATUS = 'NOT PRESENT', '',AOut.TIME) AS OUT
  , IIF(AIn.STATUS = 'NOT PRESENT', '',
          dateadd("s", datediff("s", AIn.TIME, AOut.TIME)-datediff("s", 0, MD.DefRest), 0)) AS DUROFWORK
  , IIF(cdate(AIn.[TIME]) > cdate(MD.DEFIN), format(dateadd("s", datediff("s", cdate(MD.DEFIN),
          cdate(AIn.[TIME])),0),"hh:nn:ss"),'') AS LATEIN
FROM ((ABSEN AS AIn 
       INNER JOIN MASTERDAYS AS MD ON AIn.LOCATION = MD.LOCATION) 
       INNER JOIN MASTERID AS MI ON MI.ID=AIn.ID)
       LEFT JOIN (SELECT * 
                  FROM ABSEN AS AOut1 
                  WHERE AOut1.INOUT='OUT') AS AOut ON (AOut.LOCATION=AIn.LOCATION) AND (AOut.DATE=AIn.DATE)
WHERE format(AIn.Date,"dddd")=MD.day
      AND  AIn.INOUT='IN';

Я предположил, что ваша «другая» таблица NAM В моем случае я сохранил столбцы «только время» в «ShortText» (возможно, вам придется настроить, если у вас другое.

спасибо за ответ, но почему вы используете hh:nn:ss, а не это hh:mm:ss

dlaksmi 27.08.2024 09:58
support.microsoft.com/en-au/office/…
tinazmu 27.08.2024 10:11

Я хочу спросить тебя. для 1. Я не вижу столбец Days в вашем ответном запросе. Есть ли он в этом коде строки MD.day as [Day of Week],, но он из таблицы MASTERDAYS и 2. Пример из таблицы Absen У меня есть столбец ID, тогда я хочу присоединить его к таблице MASTERID, чтобы возьмите колонку MASTERID.NAMEID Как мне адаптировать код из вашего ответа. Пожалуйста, направь меня

dlaksmi 27.08.2024 10:36

Я попробовал этот запрос, но записи не вернулись.

June7 27.08.2024 11:15

Вы должны сообщить нам типы данных, которые вы использовали.

tinazmu 27.08.2024 12:00

@dlaksmi, у нас есть format(AIn.Date,"dddd")=MD.day в пунктеwhere; так это одно и то же.

tinazmu 27.08.2024 12:23

@June7, я сохранил время в текстовом формате (в Access нет типа данных «время», но я думаю, я мог бы хранить их с частью даты «0»). Я протестировал его с опубликованными данными OP - как показано; Я не знаю, почему у тебя нет ссор; вы пытались немного его отладить: «почему он не возвращает ни одной строки»?

tinazmu 27.08.2024 13:07

@dlaksmi, я обновил его, добавив идентификатор

tinazmu 28.08.2024 00:30

@tinazmu Спасибо, но ID не со стола MASTERDAYS а с другого стола MASTERID

dlaksmi 28.08.2024 04:56

Я еще раз поменял, предположил, что вы присоединяетесь к MASTERID через MASTERID.ID. Было бы намного проще, если бы вы отредактировали свой вопрос и включили эти дополнительные требования в таблицу DDL (т. е. как мы узнаем, как эти таблицы связаны между собой?)

tinazmu 28.08.2024 05:10

@tinazmu, твое обновление ответа идеально. Если у меня возникнут вопросы, я обязательно вам задам

dlaksmi 28.08.2024 11:30

@tinazmu, для других мне удалось отформатировать успешно, но код строки не работал FORMAT(AIn.Date,"dd-MMM-yy") AS [DATE] Результат в средстве просмотра отчетов 26-Aug-24 00:00:00 . Что-то не так с форматом?. AOut.Date Нужно ли это тоже форматировать, если да, то как?

dlaksmi 28.08.2024 11:49

Каков тип данных AIn.DATE? Какой у вас инструмент отчетности? если AIn.Date находится в тексте; функция ФОРМАТ была бесполезна; и похоже, что ваш инструмент отчетов считывает/сопоставляет его с полем DATE&TIME и форматирует его 26 августа 24 00:00:00; вам нужно сопоставить его с полем text/char.

tinazmu 28.08.2024 12:27

Другие вопросы по теме