CaThey Joy Galias Ответов: 2

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


Привет, нужна помощь, ребята как можно скорее.. мне нужно получить точное общее количество часов, перечисленных в datagridview, как только я нажму кнопку заполнения ... имя заголовка столбца datagridview-дата,статус, время
эти ценности таковы


дата=22/03/2018 дата=22/03/2018
статус= статус= выход
время=7:30 Время= 14:00

дата=23/03/2018 дата=22/03/2018
статус=статус=выход
время= 6:45 Время = 17:00

общее количество часов в течение двух дней всегда 16.. как вы можете видеть, она вышла в 2 часа дня, а затем опоздала на 30 минут утром..

политика для своего времени
это 7 утра-5 вечера часов работы = 8 часов работы 2 часа являются брейктымами (не засчитываются)
утреннее время визуализации = 3,5
послеполуденное время визуализации = 4,5
итого = 8 часов
.
.
как я могу получить точное общее время работы сотрудника ?я думаю, что у меня есть ошибка этого кода.

Что я уже пробовал:

If txtID.Text = "" Then
        MsgBox("insert Employee ID")

    ElseIf txtID.Text <> "" Then
        Try
            totalMins = 0
            conn.Open()
            query = New MySqlCommand("SELECT No, Name, date, status, position,TIME_FORMAT(STR_TO_DATE(time,  '%l:%i:%s %p'), '%H:%i %p') AS time,HOUR(TIME_FORMAT(time, '%H:%i ')) AS hour,MINUTE(TIME_FORMAT(time,'%H:%i')) AS minute From cash_table WHERE No=" & txtID.Text & " AND (date BETWEEN '" & DateTimePicker2.Value.Date & "' AND '" & DateTimePicker3.Value.Date & "')", conn)
            dr = query.ExecuteReader()
            If dr.HasRows Then
                Do While dr.Read()
                    'Console.WriteLine(dr.GetInt32(0) & vbTab & dr.GetString(1))
                    txtName.Text = dr.GetString("Name")
                    txtPosition.Text = dr.GetString("position")

                    arr(0) = dr.Item("date")
                    arr(1) = dr.Item("status")
                    'arr(2) = dr.Item("position")
                    arr(2) = dr.Item("time")
                    DataGridView1.Rows.Add(arr)

                    stat = dr.Item("status")
                    timeHr = dr.Item("hour")
                    timeMin = dr.Item("minute")

                    If (stat = "IN") Then
                        lateMin = 0
                        extMin = 0

                        If (timeHr > 7) Then
                            lateMin += (timeHr - 7) * 60

                        End If

                        If (timeHr >= 7) Then
                            If (timeMin > 0) Then
                                lateMin += (timeMin)
                            End If
                        End If
                    ElseIf (stat = "OUT") Then
                        If (timeHr > 17) Then
                            extMin += (timeHr - 17) * 60
                        End If

                        If (timeHr >= 17) Then
                            If (timeMin >= 15) Then
                                extMin += (timeMin)
                            End If
                        End If

                        If (timeHr > 17) Then
                            extMin += (3.5 - (timeHr - 13)) * 60 + timeMin - 16

                        End If
                        totalMins += (480 - lateMin) + (extMin)
                        totalMins = Val(totalMins) - Val(16)
                    End If
                Loop
            Else
                MsgBox("No Records Found!", MsgBoxStyle.Information, "Search")
            End If
            dr.Dispose()

            TextBox4.Text = Math.Floor(totalMins / 60) & ":" & (totalMins Mod 60)

        Catch ex As Exception
            MsgBox(ex.Message)

        Finally
            dr.Dispose()
            conn.Close()

        End Try

        If txtID.Text = "" Then
            DataGridView1.Rows.Clear()
            txtName.Clear()
            txtPosition.Clear()
        End If

    End If

Richard MacCutchan

Используйте правильные типы DATETIME, чтобы вы могли легко вычислять точные временные интервалы.

CaThey Joy Galias

Пример пожалуйста, я только начинающий на этот код

2 Ответов

Рейтинг:
2

Patrice T

Цитата:
я думаю, что у вас есть ошибка этого кода.

Что случилось такого, чего вы не ожидали ?
-----
query = New MySqlCommand("SELECT No, Name, date, status, position,TIME_FORMAT(STR_TO_DATE(time,  '%l:%i:%s %p'), '%H:%i %p') AS time,HOUR(TIME_FORMAT(time, '%H:%i ')) AS hour,MINUTE(TIME_FORMAT(time,'%H:%i')) AS minute From cash_table WHERE No=" & txtID.Text & " AND (date BETWEEN '" & DateTimePicker2.Value.Date & "' AND '" & DateTimePicker3.Value.Date & "')", conn)

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]


Рейтинг:
0

OriginalGriff

В этом коде действительно есть ошибки: никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Это не та проблема, которую вы заметили, но она нуждается в исправлении во всем вашем приложении, прежде чем вы пойдете дальше ... и мы понятия не имеем, в чем проблема, которую вы заметили. Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


CaThey Joy Galias

Запрос выполняется в соответствии с потоком, единственная проблема заключается в следующем.. Вычисление...
Каков правильный код для этого