Исключение переполнения SqlDateTime
-
04-07-2019 - |
Вопрос
Я пытаюсь вставить значение только для времени, но получаю следующую ошибку
- пример {"Переполнение SqlDateTime.Должно быть между 1/1/1753 12:00:00 утра и 31/12/9999 11:59:59 вечера."} System.Исключение
Во внешнем интерфейсе время выбирается с помощью элемента управления "TimeEdit" со стрелками вверх и вниз.В таблице в SQL Server поля заданы как smalldatetime.Мне нужно только сохранить время.Я использую следующее для возврата данных в приложение
выберите id, ПРЕОБРАЗУЙТЕ (CHAR(5),TimeFrom, 8)в TimeFrom, ПРЕОБРАЗУЙТЕ (CHAR(5),TimeTo, 8) в TimeTo ИЗ dbo.Доступность где id = @id и dayName = @weekday (день недели)
Как мне скоротать время только за столом?
Редактировать ~ Решение Согласно Эуардо и Крису, мое решение состояло в том, чтобы передать строку datetime вместо строки только по времени.Я отформатировал свой результат в соответствии Формат времени используя букву "g".
Спасибо
Решение
Выберите дату, которая находится в диапазоне (например, 1/1/1970), и используйте ее для всего, что вы вставляете.
Другие советы
Вы можете установить дату равной 1/1/1753, которая является минимальным значением даты для datetime в MSSQL, а затем добавить час, который вы хотите сохранить.Конечно, вы должны учитывать это каждый раз, когда вам нужно получить значение, но вы можете обернуть это с помощью некоторых помощников.Или вы можете использовать MSSQL 2008 и использовать новый тип данных TIME.
Если вы отслеживаете только время, подумайте о том, чтобы сохранить его в int как смещение от полуночи с любой необходимой вам степенью детализации (секунды, минуты, часы, ...).Затем вы можете преобразовать его во временной интервал в своем коде, используя соответствующий метод TimeSpan.From??().Чтобы вернуться другим путем, вы можете использовать TimeSpan.Итого??и усеките, если понадобится.Если вам нужно выполнять запросы вручную, вы можете написать SQL-функцию, которая преобразует часы / минуты / секунды в эквивалентное смещение.
Я предпочитаю это использованию datetime и выбору произвольного дня, поскольку это делает назначение поля более ясным, что уменьшает путаницу.
в SQL нет такого понятия, как Время, есть только DateTime.
Для вашей цели я бы использовал что-то вроде этого, чтобы возвращать только временную часть.
SELECT (GETDATE() - (CAST(FLOOR(CAST(GETDATE() as FLOAT)) AS DateTime)))
где GETDATE() - это дата-время, которое вы хотите отфильтровать.
При установке времени в базе данных вам нужно будет добавить ко времени '01/01/1901' или '01/01/1753'.
Не используйте приведение и преобразование в varchar при работе с datetime, это медленно.Придерживайтесь плавающих числовых операций.