Czas a aplikacje bazodanowe

Ta rada przyda się każdemu kto nie jest doświadczonym programistą, jeżeli chodzi o systemy korzystające z serwerów baz danych.
Czego rzecz się tyczy? Dat. A konkretnie godzin, albo może nawet minut.
Wiele razy widziałem aplikacje, w których na przykład mieliśmy kod procedury składowanej pobierającej dane:


...
@date DATETIME --parametr procedury
...
SELECT * FROM Tabela WHERE DataWstawienia < @date
...

oraz przykładowo procedura wstawiająca dane:


...
INSERT INTO Tabela(..., DataWstawienia) VALUES(..., GETDATE())
...

Z pozoru wszystko jest ok prawda? Problem zaczyna się kiedy spełnione są dwa warunki:
1) zależy nam na dokładności
2) baza danych jest na innym serwerze niż nasza aplikacja

Gdzie problem?
Procedura pobierająca dane przyjmuje datę jako parametr, zaś wstawiająca pobiera ją funkcją GETDATE(). Co zaś się stanie, jeżeli oba komputery (serwer bazy danych i aplikacji) nie mają zsynchronizowanych zegarków? Klapa. Okaże się, że czasem niektóre dane będą błędnie wybierane z uwagi na różnice pomiędzy zegarami. Może się okazać, że rekord który wstawialiśmy o 8:45 w bazie jest zapisany z godziną wstawienia 8:43.

Może się wydawać, że taka sytuacja raczej się nie wydarzy. Cóż mi się przytrafiła. Od tej chwili planuję wyrobić sobie nawyk "generowania" dat po jednej stronie - w bazie, a jeżeli to nie jest możliwe w aplikacji. W tym przypadku trzeba by zmienić procedurę wstawiającą dane tak, aby przyjmowała również datę.