mssql i datetime

0

Witam
Czy i w jaki sposob moge narzucic format danych typu datetime
powiedzmy mam kolumne typu datetime i wartosci w niej sa typu np.
1947-12-04 0855
chce aby w tej kolunie byly tylko wartosci "czasowe" czyli sam czas
0855
Potrzebne mi jest to po to aby przechowywac w bazie czasy rozpoczecia i zakonczenia pracy danych pracownikow.

prosze o pomoc

0

hmm nigdy nie korzystałem z mssql, ale nie ma tam czasem typu samego czasu (wiem że to może być głupie pytanie) ? a jeśli nie ma, to zastosowanie TDateTime nie powinno być bardzo bolesne po prostu nie będziesz korzystał ze wszystkich przechowywanych tam informacji (???). no i zawsze można się bawić na bitach jakiejś liczby.

0

no tak :) tylko jak wezme sobie sam czas przez zmienna, to i tak nic nie da - bo wpisujac do bazy sam czas - system dopisze mi rok 1900 :)
i kicha.
Generalnie chodzi mi o cos takiego
sa 3 zmiany

  1. 7-15
  2. 15-23
  3. 23-7
    i teraz chce aby system sam rozpoznal (po czasie) która to zmiana - oczywiscie przedzialy zmian musz byc w bazie - aby byly konfigurowalne
0

nie dokońca rozumiem o co chodzi, ale chyba proponowałbym zapisanie przedziałów poza bazą, a w niej samej tylko odniesienia do nich, właśnie na zasadzie 1,2,3.

0

to przy wyświetlaniu formatuj dane tak, aby był pokazany sam czas, w czym problem?

0

Jeśli ma to być w ten sposób, to może po prostu zrób tabele słownikową z tymi 3 (na razie) zakresami pracy w postaci varchar, i wstawiaj do odpowiedniej tabeli wymienione 1,2,3 - gdzie 1,2,3 to klucz obcy pochodzacy z utworzonej tabeli słownikowej.

0

Po pierwsze, w SQL jest taki typ danych jak:

TIME
Format: hhss
Rozmiar w pamięci: 3 bajty

Jeśli zaś chodzi o wyciągnięcie czasu z DATETIME, to chyba najłatwiej tak:

DATE_FORMAT(Twoj_DATETIME, Format);

Gdzie Format :=

%T - Pełny czas w systemie 24h
%H - Godzina w systemie 24h (zawsze dwie cyfry)
%i - minuty
%S - sekundy

...i tak dalej, odsyłam do helpa ;)

0

Obawiam sie ze w mssql(tak jak w temacie) sa dwa typy czasowe datetime i smalldatetime :) a TIME brak :) - nawet w helpie

Co do wyswietlania daty hmm mozna ale chodzi mi generalnie o to - aby system sam decydowal na podstawie bieżącego czasu do którego przedziału należy dana godzina.
Jezeli chodzi o typy datetime to jak wiecie - gdy nie poda sie daty to system sam automatycznie wpisuje bodajze rok 1900 itd - co nie jest na rękę - generalnie doskwiera brak typu time :) - w razie przeszukiwania, porownywania samych czasow itd zawsze bedzie sie przewijak temat daty wraz z czasem
pozdrawiam

0
danek napisał(a)

Obawiam sie ze w mssql(tak jak w temacie) sa dwa typy czasowe datetime i smalldatetime :) a TIME brak :) - nawet w helpie

obawiam się, że jednak ma http://dev.mysql.com/doc/refman/4.1/en/date-and-time-types.html

0

hmm MYSQL - owszem
ale MSSQL chyba nie - moze sie myle

0

fakt, w mssqlu nie ma :(. A nie możesz zapisywać nie tylko godziny ale i daty? Czy to by w czymś przeszkadzało? A potem tylko odpowiednie formatowanie przy wyświetlaniu i tyle

0

Aaah, myślałem (podobnie jak kolega na górze) że chodzi o mysql.

Swoją drogą to myślałem że wszystkie systemy oparte na SQL mają typ TIME, ale nie będę szukać po helpach.

Teraz kiedy w MySQL masz transakcje, triggery nie wiem po co mssql;)

W kazdym razie masz parę rozwiązań:

  1. formatować dane przy wyciąganiu z tabeli, nie jest to w końcu aż tak pracochłonne aby dopisać parę literek

  2. stworzyć sobie 3 pola Byte, nazwane godzina, minuty, sekundy oraz pole wyliczeniowe gdzie baza bedzie to automatycznie scalać w pożądany przez Ciebie format, lub po prostu robić scalanie na poziomie aplikacji (co jest dużo lepszym rozwiązaniem, bo odciąża serwer).

Zajmie to tyle miejsca co zmienna TIME, a oszczedzisz 5 bajtów na każdym rekordzie.

Swoją drogą przechowywanie dzisiejszych dat w polu DATETIME jest niewskazane (chyba że chodzi o daty przed 1970). Dużo lepiej i wydajniej jest zapisywać datę jako zwykły Integer w formacie uniksowym (liczba milisekund od 1 stycznia 1970), a potem na poziomie serwera lub aplikacji klienckiej (lepiej) zamieniać na czas i datę. Oszczędność 4 bajty na każdym rekordzie.

Bo tak naprawdę dobrze zrobiona i zaprojektowana baza będzie lepiej śmigać na MySQL, niż nieznormalizowana i niewydajna baza na Oracle ;) (choć moge się mylić).

0

hmmm

ok to moze mała podpowiedz jak sformatowac wyswietlanie takiej kolumny?

0

Niestety nie znam się na MsSQL, na pewno musisz kombinować z funkcją CONVERT.

Nie wiem dla kogo to robisz... Jeśli dla siebie lub niedużej firmy to może warto pomyśleć nad darmowym rozwiązaniem jak MySQL, czy Postgres.

Jeśli chodzi o scalanie tego na poziomie Delphi to już nic prostszego, po prostu wyciągnięte dane (godziny, minuty sekundy) zamieniasz na stringi

Procedure TChildForm.Button1Click(Sender: TObject);
Var
  Czas : String;
  H, M, S : Byte;
Begin
  Query.Close; {zamyka kwerendę}
  Query.SQL.Clear; {czyści}
  Query.SQL.Add ('SELECT H, M, S FROM Tabela_Logowan WHERE idLogowanie='''+Edit1.text+''''); {tu jest kwerenda dla MySQL, musisz wstawić odpowiednik dla MSSQL}
  Query.Open; {otwiera kwerende i wyswietla dane}
  Query.First;  {może być tylko jeden rekord o tym ID, ale na wszelki wypadek bierzemy pierwszy}
  H := Query.FieldByName('Godziny').AsInteger;
  M := Query.FieldByName('Minuty').AsInteger;
  S := Query.FieldByName('Sekundy').AsInteger;
  Czas: IntToStr(H) + '-' + IntToStr(M) + '-' + IntToStr(S);

  ShowMessage('Czas dla Logowania o ID ='Edit1.text+'  to: '+Czas);
End;

Możliwe że da się prościej, ale nie zaglądałem od jakiegoś czasu do baz danych.

0
danek napisał(a)

hmmm

ok to moze mała podpowiedz jak sformatowac wyswietlanie takiej kolumny?

http://4programmers.net/Forum/viewtopic.php?id=83763 tu masz odpowiedz jak formatować dane w kolumnie

1 użytkowników online, w tym zalogowanych: 0, gości: 1