Zapis daty do bazy w formacie dd-MM-yyyy

0

Witam,
mam problem z zapisem do bazy Daty w postaci 25-08-2014.
Próbowałem różnych sposobów, ale mi nie wychodzi.
np:

 
var
  MySettings: TFormatSettings;
  s: string;
  d: TDate;

begin
GetLocaleFormatSettings(GetUserDefaultLCID, MySettings);
MySettings.DateSeparator := '-';
MySettings.ShortDateFormat := 'dd-MM-yyyy';
s := DateToStr(DateTimePicker2.Date, MySettings);    // pokazuje  25-08-2014.  
d := StrToDate(s, MySettings);                               //25-08-2014.
               

IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.ADD('Insert INTO DATA (Start_DATA) VALUES(:P1)');
IBQuery1.ParamByName('P1').AsDate:=d;  //  daje rezultat 2014-08-25
IBQuery1.ExecSQL;
IBTransaction1.Commit;
end;

W DateTimepicker w ustawieniach FORMAT ustawiłem dd-MM-yyy.
Ma ktoś jakiś pomysł?
Proszę o pomoc.

0

A dlaczego chcesz mieć akurat ten format w bazie? Zapisz go w ten sposób, i dopiero przy odczycie wyświetl tak jak Ci się podoba. Nikt Ci przecież nie będzie patrzył do bazy, hm? :)

0

@TomRiddle
A jak wyświetlić w DBGridzie date w tym formacie?
Przepraszam, że takie pytanie ale nie robiłem tak jeszcze.

0

Pokaż mi jak wyświetlasz teraz to powiem Ci co zmienić

0

po prostu

 
 IBQUERY2.Close;
  IBQuery2.SQL.Clear;
  IBQuery2.SQL.Add('SELECT Login,Haslo,START_DZIEN FROM DATA ');
   IBQuery2.Open;

Gdzie w START_DZIEN jest data zapisana w formacie 2014-08-25

Wyświetlane jest w DBGridzie.

1

Przyznam szczerze, ze nie znam odpowiedzi i nie mam delphi zeby akurat sobie poeksperymentowac, ale sprobuj zrobic cos takiego:

TDateTimeField(IBQUERY2.FieldByName('START_DZIEN')).DisplayFormat := 'dd-MM-yyyy');

Mozesz tez poszukac na googlach jak wykorzystac propercje DisplayFormat w kontrolce DBGrid lub wlasciwie to chyba nawet nie w DBGrid tylko w DataSet czy w klasie reprezentujacej zapytanie.

Moze troche ogolnikowo napisalem, ale byc moze moja wypowiedz na cos Cie naprowadzi.

lukasz_p92 napisał(a):

Gdzie w START_DZIEN jest data zapisana w formacie 2014-08-25

Data nie powinna byc zapisana w takim czy innym formacie. Powinienes miec kolumne typu DATE (o ile taki typ istnieje, jezeli nie to wtedy nalezy poszukac odpowiednika tego typu). Date powinienes formatowac dopiero podczas wyswietlania.

dodanie znacznika <code class="delphi"> - furious programming

1

Osobiśnie nie pracuję z bazami danych, ale podzielam zdanie @tk - Data i czas to liczba (konkretniej alias typu Double), więc powinieneś zapisać datę/liczbę, a nie wynik konwersji daty i czasu na łańcuch znaków; Samych łańcuchów zawierających przekonwertowane składowe nie możesz normalnie porównywać, a poza tym utracisz bezpowrotnie składowe czasu;

Zapisać masz liczbę, a jedynie podczas wyśwsietlania danych w danym komponencie (dowolnym, nie tylko w komponentach związanych z bazą danych), przedstawiasz datę i czas przekonwertowaną na łańcuch, oczywiście w stosownym formacie; Do samej konwersji daty i czasu na ciąg znaków możesz skorzystać np. z funkcji DateTimeToStr lub FormatDateTime;

Dzięki temu po pierwsze dane będa zajmowały tyle, ile zajmować mają (a nie więcej, jak w przypadku łańcuchów), po drugie zachowasz składowe czasu i będziesz je mógł wykorzystać w przyszłości podczas rozbudowy programu, po trzecie będzie to szybsze, bo mniej konwersji będziesz musiał wykonać.

0
lukasz_p92 napisał(a):

Witam,
mam problem z zapisem do bazy Daty w postaci 25-08-2014.

Już Ci inni pisali, że to bzdura. Nie zapisuje się daty w formacie "dd-mm-yyyy" ani w żadnym innym.
To jak jest data wyświetlana , zależy od ustawień wyświetlania (regionalnych) danego komputera i możesz to zmienić za pomocą globalnego rekordu System.SysUtils.FormatSettings, ale o tym dalej...

Próbowałem różnych sposobów, ale mi nie wychodzi.
np:

 
var
  MySettings: TFormatSettings;
  s: string;
  d: TDate;

begin
GetLocaleFormatSettings(GetUserDefaultLCID, MySettings);
MySettings.DateSeparator := '-';
MySettings.ShortDateFormat := 'dd-MM-yyyy';
s := DateToStr(DateTimePicker2.Date, MySettings);    // pokazuje  25-08-2014.  
d := StrToDate(s, MySettings);                               //25-08-2014.
               

IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.ADD('Insert INTO DATA (Start_DATA) VALUES(:P1)');
IBQuery1.ParamByName('P1').AsDate:=d;  //  daje rezultat 2014-08-25

Żadne "daje rezultat".
Zrozum - wyświetlanie dat (i innych typów numerycznych) nie ma nic wspólnego z ich faktyczną reprezentacją. Nic a nic.
Skoro masz ustawiony format daty w systemie na yyyy-dd-mm to tak będzie wyświetlać daty Twoja aplikacja.
Możesz zmienić format wyświetlania w systemie, co jest najgłupszym pomysłem.
Możesz ustawić format tylko dla Twojej aplikacji przez:

FormatSettings.ShortDateFormat := 'dd-mm-yyyy';

Wystarczy że ten kod uruchomisz raz na całą aplikację (np. podczas odczytywania ustawień) i już.
Ale to tez nie jest dobry pomysł. Dlaczego nie zostawisz formatu daty w spokoju?
Tak jak użytkownik sobie ustawił formaty danych, to niech tak ma.

 
IBQuery1.ExecSQL;
IBTransaction1.Commit;
end;

W DateTimepicker w ustawieniach FORMAT ustawiłem dd-MM-yyy.
Ma ktoś jakiś pomysł?
Proszę o pomoc.

No mam, a nawet kilka ;-)

0

@wloochacz z DateTimePicker zapisuje do kolumny START_DZIEN która jest typu DATE.
i w bazie mam 2014-08-28.
A jak mam wyświetlić to w DBGRidzie jako 28-08-2014?

Gdy dam w FormCreate formularza

 FormatSettings.ShortDateFormat := 'dd-mm-yyyy';

pokazuje błąd Undeclared identifier FormatSetting.

1

W starszych Delphi nie

FormatSettings.ShortDateFormat := 'dd-mm-yyyy';

a ShortDateFormat := 'dd-mm-yyyy';

1

@lukasz_p92 - a czy Ty w ogóle masz zadeklarowany rekord o identyfikatorze FormatSettings? Jeśli nie, to nie dziw się, że kompilator nie zna takiej zmiennej i nie może skompilować kodu.

0

Taka pierdoła a tyle mi problemu przyniosła.
Dziękuję!

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