2009-05-01 32 views
7

Jak przechowywać w SQL czas lub zakres czasowy? Nie będzie datetime, ponieważ będzie po prostu powiedzmy 16:30 (nie, 3 stycznia, 16:30). Będą to cotygodniowe lub codzienne spotkania. Typy zapytań, których potrzebuję, są oczywiście przeznaczone do wyświetlania, ale później będą zawierać złożone zapytania, takie jak unikanie konfliktów w harmonogramie. Wolę teraz wybrać najlepszy typ danych.Czas przechowywania dnia w SQL

Używam MS SQL Server Express 2005.

Dzięki!

Nathan

Odpowiedz

4

Polecam nadal używa typ danych DateTime i ignorując wartości dat - najlepiej przy użyciu statycznej MinDate dla SQL (google). Zapewni to korzyści płynące z pracy z silnie typowanym polem, a jedynym kosztem będzie kilka dodatkowych bajtów.

Jeśli chodzi o zakresy, przechowuj je w dwóch osobnych kolumnach. Następnie możesz odjąć jeden od drugiego, aby określić różnicę.

Edycja: zrobił kilka Googling.

  • SQL Server 2008 dodaje typ danych Czas, więc warto wziąć to pod uwagę.
  • Można użyć SQL 2005 jest typu DateTime i połączyć go z funkcji CONVERT wyodrębnić tylko HH: MM: SS.mmm
  • Różne wersje SQL obsługują różne minimalne daty. Możesz użyć statycznej daty, która będzie obsługiwana przez wszystkich, takich jak 1/1/2000, lub możesz użyć wartości minimalnej SQL 2005 z 1/1/1753 i dołączyć wartości czasu do tego dnia początkowego

Więc jeśli pozostaniesz w 2005 roku, wybierz datę statyczną, np. 1/1/2000 i zapisz swoje czasy. Tak więc 1m: 30s to 2000-1-1 00: 01: 30.000, a 1h: 15m to 2000-1-1 01: 15: 00.000

Możesz wtedy zrobić Date2 - Date1 i otrzymać wynik (1h: 15: m - 1m: 30s) 2000-01-01 01: 13: 45.000. ZMIENIAJ ją, a otrzymasz 1:13:45.

+0

Zauważ, że użycie CONVERT w ten sposób wyłącza jakiekolwiek użycie indeksów w kolumnie datetime –

+0

Interesujące, nie wiedziałem o tym efekcie. Dziękujemy za podpowiedź – STW

+0

Dla przyszłych czytelników, przed użyciem tej metody sprawdź komentarz autorstwa @tvanfosson http://stackoverflow.com/questions/812631/store-time-of-the-day-in-sql?lq=1#comment622411_812669 – Termiux

1

Można go zapisać jako format 24-godzinny i format według potrzeb.

lub zapisać je jako datetime z pewnym ustalonym terminie i usunąć go, ile potrzeba na wyświetlaczu: Jan 1 2000 16:30

pójdę z pola datetime ponieważ daje moc wszystkich datetime powiązanej funkcjonalność.

1

Możesz rozważyć zapisanie go jako kolumny int reprezentującej liczbę minut od północy. W twojej istocie możesz wystawić to jako TimeSpan (lub int) reprezentujące to samo. Konieczne będzie jedynie konwersja między wartościami wyświetlania (formatem czasu) a wartością bazy danych (minuty) w celu wykonania zapytań, co można łatwo zrobić w jednostce (na przykład TimeSpan.TotalMinutes).

+0

To jest uczciwe rozwiązanie, ale nie jest intuicyjne, gdy patrzy się na stolik lub łatwo się zmienia (co, jeśli chce podnieść rozdzielczość ?, musieliby zmodyfikować istniejące wartości). Użycie dostarczonego typu danych, szczególnie w przypadku danych z wewnętrznymi regułami, takimi jak czas, pozwala uniknąć wykonywania wielu zadań matematycznych - a także czyni to bardziej oczywistym dla przyszłych programistów. – STW

+0

Zakładając, że wymagana dokładność to sekundy, alternatywą jest int w formacie hhmmss. Nie jest tak przydatna, jeśli musisz obliczyć różnicę między dwoma wartościami, ale tworzy bardziej czytelne zapytania - GDZIE Czas> = 120000 AND Czas <130000. – Joe

+1

@Jedzenie - to właśnie dlatego użycie DateTime może zmylić przyszłych programistów, których uniknęłabym w tym celu. Zazwyczaj z DateTime można oczekiwać, że część daty byłaby ważna. Co się stanie, jeśli przyszły programista zdecyduje się użyć innej daty jako stałego punktu (lub używa DateTime.Today). Przechowywanie go jako kolumny o odpowiedniej nazwie "MinutesFromMidnight" bardzo wyraźnie określa cel. Matematyka działa o tej samej 14:30 jest nadal po 13:30 i przed 14:30. Konwersja jest trywialna: TimeSpan.FromMinutes(). TimeSpan również łatwo formatuje. – tvanfosson

6

Osobiście uważam, że jest to powód do aktualizacji do 2008 roku, który ma osobny typ danych czasu.

+0

Po drugie, zwłaszcza, że ​​mówimy o edycji Express (mam nadzieję, że to nie jest duży system produkcyjny). Niewielki ból uniesienia byłby tego warty. – STW

+0

+1 Uzgodniono ...... –

0

Dla mnie brzmi to, jakbyś opracowywał typ harmonogramu spotkań lub coś do wyświetlenia spotkań.

Myślę, że ustawiłbym go z 2 kolumnami MeetingStart i MeetingEnd, zarówno jako pola datetime. W ten sposób możesz ustalić długość spotkania, a ponieważ masz już tę datę, możesz z łatwością użyć jej do wyświetlenia w kalendarzu lub czymś podobnym.

Powiązane problemy