Хранить время дня в SQL - PullRequest
7 голосов
/ 01 мая 2009

Как бы вы сохранили время или временной диапазон в SQL? Это не будет дата, потому что это будет, скажем, 4:30 вечера (не 3 января, 16:30). Это были бы еженедельные или ежедневные встречи. Тип запросов, которые мне нужны, конечно, для отображения, но позже они будут включать сложные запросы, такие как предотвращение конфликтов в расписании. Я бы лучше выбрал лучший тип данных для этого сейчас.

Я использую MS SQL Server Express 2005.

Спасибо!

Nathan

Ответы [ 5 ]

6 голосов
/ 01 мая 2009

Лично я нашел бы эту причину для обновления до 2008, у которого есть отдельный тип данных времени.

4 голосов
/ 01 мая 2009

Я бы порекомендовал по-прежнему использовать тип данных DateTime и игнорировать значения даты - в идеале, используя статическую MinDate для SQL (Google it). Это даст вам преимущества работы со строго типизированным полем, и единственной стоимостью будет несколько дополнительных байтов.

Что касается диапазонов, храните их в двух отдельных столбцах. Затем вы можете вычесть одно из другого, чтобы определить разницу.

Редактировать: немного погуглил.

  • SQL Server 2008 добавляет тип данных Time, так что вы можете рассмотреть это.
  • Вы можете использовать тип DateTime в SQL 2005 и объединить его с функцией CONVERT, чтобы извлечь только HH: MM: SS.MMM
  • Различные версии SQL поддерживают разные минимальные даты. Вы можете использовать статическую дату, которая будет поддерживаться всеми, например, 1/1/2000, или вы можете использовать минимальное значение SQL 2005, равное 1/1/1753, и добавить значения времени к этому начальному дню

Так что, если вы придерживаетесь 2005 года, выберите статическую дату, например, 1/1/2000, и сохраните в ней свое время. Таким образом, 1: 30: 2000-1-1: 00: 01: 30.000, а 1: 15: 2000-1-1: 01: 15: 00.000

.

Затем вы можете выполнить Date2 - Date1 и получить свой результат (1ч: 15: м - 1м: 30с) 2000-01-01 01: 13: 45.000. Преобразуйте его, и вы получите 1: 13: 45.

1 голос
/ 01 мая 2009

Возможно, вы захотите сохранить его в виде столбца типа int, представляющего количество минут с полуночи. В вашей сущности вы можете выставить это как TimeSpan (или int), представляющее одно и то же. Вам нужно всего лишь выполнить преобразование между отображаемыми значениями (формат времени) и значением базы данных (минуты) для выполнения ваших запросов, и это можно легко сделать в вашей сущности (например, TimeSpan.TotalMinutes).

1 голос
/ 01 мая 2009

Вы можете сохранить его как int как 24-часовое время и отформатировать по необходимости.

Или сохраните его как дату-время с некоторой фиксированной датой и удалите его при необходимости для отображения: 1 января 2000 16:30

Я бы выбрал поле datetime, так как оно дает вам всю функциональность, связанную с datetime.

0 голосов
/ 02 мая 2009

для меня это звучит так, будто вы разрабатываете тип планировщика собраний или что-то для отображения собраний.

Я думаю, что я установил бы его с 2 столбцами MeetingStart и MeetingEnd, оба как поля даты и времени. Таким образом, вы можете определить продолжительность встречи, и, поскольку у вас уже есть дата, вы можете легко использовать ее для отображения в календаре или чем-то еще.

...