StudentSC Ответов: 4

Как мы находим значение между двумя часами в C#?


Я хочу найти разницу между двумя часами.Но я не нахожу.Я объясняю этот вопрос.

Таблицы Sql:

Старая Строка Таблицы Состояния: StatusID(int)

Новая Строка Таблицы Состояния: StatusID(int),Time(DateTime)

Я добавил новое поле времени в свою таблицу.Я хочу Status = 1, когда время займет столбец time.И если через 2 часа все еще статус = 1, я хочу, чтобы сообщение об ошибке вернулось.
Значение времени и найти следующее значение 2 часа и вычислить разницу между ними.

Например: Если statusID=1 => Время: 10:00

Если statusID=1 => Время: 12:00

12:00-10:00 = 2 часа

{ Функции MessageBox.Шоу("Хата"); }

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

I write this code

if(.....("Select * from Status Where StatusID=0"))
ExecuteQuery("UPDATE Status set from StatusID=1 ",CommandType.Text);

try
{
    // I write other code.

DateTime now=DateTime.Now;
DateTime Time=new DateTime("hh:mm");
DateTime nextTime;
nextTime=now.AddHours(2);
TimeSpan DifferenceTwoTime = DateTime.Parse(now).Subtract(DateTime.Parse(Time));
string Difference = DifferenceTwoTime.ToString();
if (Difference>2)
{
{ MessageBox.Show("Hata"); }

}

ExecuteQuery("Update Status Set StatusID=0",CommandType.Text);

}

MadMyche

Вам действительно нужно создать список требований для этой операции, и совместное использование схемы базы данных тоже было бы полезно.
То, что вы предоставили до сих пор, разрозненно, и, не зная точно, что вам нужно, вы получите только часть того, что хотите; и тогда мы закончим с кучей комментариев "мне тоже нужно это...", потому что ответ, хотя и правильный на вопрос, был не всем, что было нужно.

4 Ответов

Рейтинг:
2

Richard MacCutchan

Почему вы используете строки для значений в своих расчетах? Все, что вам нужно, - это два значения DateTime и TimeSpan. Тогда вы можете сделать что-то вроде:

DateTime oldtime = // DateTime value from the database
DateTime newtime = DateTime.Now;
TimeSpan difference = newtime - oldtime;
if (difference.Hours >= 2)
{
    // action when more than two hours elapsed
}


[no name]

Привет, это то, что я хочу.
Но когда он имеет статус 1, я хочу распечатать его сейчас и получить его как старое значение.

Например:
ExecuteQuery("UPDATE Status set from StatusID=1 ");
Олдтаймер датавремя=Датавремя.Сейчас;

DateTime newtime=AddHours(2);

Разница во времени=newtime-oldtime;
если(разница.Часы работы >=2)
{

}

Richard MacCutchan

Извините, но этот код не имеет смысла. Почему вы добавляете 2 часа, а затем проверяете, если разница больше 2?

Maciej Los

+5!

Richard MacCutchan

Спасибо Мацей, и с Новым годом тебя.

Maciej Los

И тебя с Новым годом, Ричард!

Рейтинг:
2

RickZeeland

Возможно, вы захотите использовать промежуток.TotalHours, смотрите пример здесь: промежуток.TotalHours Property (System) | Microsoft Docs[^]


Рейтинг:
1

Maciej Los

Основываясь на вашем объяснении (в вопросе) и комментарии к решению 1, Ричард Маккатчан[^]:

EngineerSC

Привет, это то, что я хочу.
Но когда он имеет статус 1, я хочу распечатать его сейчас и получить его как старое значение.

Например:
ExecuteQuery("UPDATE Status set from StatusID=1 ");
DateTime oldtime=DateTime.Now;

DateTime newtime=AddHours(2);

TimeSpan difference=newtime-oldtime;
if(difference.Hours >=2)
{

}


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

Похоже, вы не предоставили достаточно информации или ваша структура таблицы неполная, потому что вы только вставляете/обновляете StatusID поле, но вы должны вставить/обновить статус и поле, которое содержит дату и время вставки/обновления. Итак, ваша структура таблицы должна выглядеть следующим образом:
DataID INT //primary key of your table
StatusID INT //foreign key, holds reference to [Statuses] table
UpdateDate DateTime //date and time of insertion/updation
...//other fields


Последовательность действий should выглядит так:

1. вставка, время: 2019-01-04 08:08:08.000
INSERT INTO YourTableName (<Fields>, StatusID, UpdateDate)
VALUES(<Fields>, 1, GETDATE())

Выше запрос добавить данные в таблицу с меткой времени.

2. верификация, время: 2019-01-04 10:58:08.000
SELECT (<Fields>, StatusID, UpdateDate)
FROM YourTableName
WHERE StatusID = 1 AND DATEDIFF(hh, UpdateDate, GETDATE())>2

Выше запрос проверяет, есть ли данные со статусом 1 и разница между временем вставки и сейчас (время проверки) больше 2 часов.
Обратите внимание, что верификация производится на уровне базы данных. Для получения более подробной информации, пожалуйста, смотрите: DATEDIFF (Transact-SQL) - SQL Server | Microsoft Docs[^]

3. Обновление, время: 2019-01-04 10:59:59.000
UPDATE YourTableName SET
StatusID = 0,
UpdateDate = GETDATE()
WHERE StatusID = 1 AND DATEDIFF(hh, UpdateDate, GETDATE())>2


Я надеюсь, что приведенный выше пример будет полезен.
Удачи вам!


[no name]

Привет.Сначала я приношу свои извинения за пропажу.
У меня есть статусид и колонка времени. И этот столбец всегда будет одной строкой. Например ID = 1 Время: 13.00
Когда идентификатор состояния обновляется как 0 Время: 15:00. Так что даже при 0, даже при 0 строка всегда будет 1 строкой в таблице. Количество строк 1 и поле "идентификатор" будет обновляться.
И я хочу сказать, что если ID равен 1, то время 1-это разница между часом и следующим временем.

Рейтинг:
0

lmoelleb

Прежде всего: никогда когда-либо используйте DateTime.Теперь для чего угодно, но не для отображения на экране. Используйте DateTime.Вместо этого UtcNow, поскольку это не делает странных вещей, когда время переключается на летнее время или с него. Не говоря уже о радостях серверов, работающих не в одном часовом поясе.
Я действительно хочу, чтобы Microsoft просто удалила DateTime.Теперь как Дата-Время.UtcNow.ToLocalTime (), по крайней мере, указывает на намерение перейти к безумию нелинейного времени.

Второй: Используйте отладчик. Он покажет вам все данные по мере выполнения вашей программы. Вы можете подумать: "отладчики продвинуты, я просто начну с отображения значений с помощью окна сообщения", но это было бы неправильно. Отладчики довольно просты в освоении, и они окупают затраты времени в несколько тысяч раз.

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

DateTime fromDatabase;
// Load the time from the database and store it in fromDatabase.
// Most databases offer specific types for this and will map to/from
// the .NET DateTime object automatically. Use this, do NOT store
// as a string. Make sure it is in UTC time. If the database
// is currently storing local time, CHANGE YOUR DATABASE.
// If changing the database to UTC time is not possible
// (and to be clear: A lot of work still means it is possible)
// use DateTime.ToUniversalTime() to set fromDatabase and shut down
// all computers that access the database on the nights where the
// time is adjusted.
int statusId;
if (fromDatabase.AddHours(2) < DateTime.UtcNow)
{
    statusId = 1;
}
else
{
    statusId = 0;
}