Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Odejmowanie wartosci pomiedzy parami rekordów ?
Forum PHP.pl > Forum > Bazy danych
Unises
Witam
Mam taki problem, jest tabela a w niej pole czas z takimi danymi (posortowane dokładnie w taki sposóB)

CZAS
2007-12-03 06:51:01
2007-12-03 15:03:01
2007-12-04 06:54:01
2007-12-04 15:01:01
2007-12-05 06:53:01
2007-12-05 15:00:01
2007-12-06 06:58:01
2007-12-06 15:02:01
2007-12-07 06:50:01
2007-12-07 15:02:01
2007-12-10 06:57:01

Czy jest w ogóle możliwe za pomocą SQL utworzenie zapytania,
które potrafiło by w nowej kolumnie lub w inny sposób pokazać wynik różnice pomiędzy parami rekordów np w godzinach .

2007-12-03 06:51:01|
2007-12-03 15:03:01|8:11

itd
2007-12-04 06:54:01|
2007-12-04 15:01:01|8:07

Oczywiście w rachubę nie wchodzi założenie warunku na dany dzień bo czasami może zdarzyć się taka para (na przełomie doby)

2007-12-04 23:53:01|
2007-12-05 06:01:01|8:08

Przykładowy wynik podałem w godzinach : z minutami
prond
Poniższe zapytanie będzie pokazywalo roznice pomiedzy biezacym rekordem, a poprzednim.
Jezeli chcesz to zrobic parami musisz dodac sobie jeszcze jedna zmienna, ktora bedzie przyjmowala na zmiane warotsci 1 i 0 i liczyc roznice miedzy datami np. tylko dla jedynki.
Roznica dat w ponizszym przykladzie jest w minutach (jako int).
  1. SET @intLastDate := 0;
  2. SELECT
  3. *,
  4. TIMESTAMPDIFF(MINUTE,@intLastDate,modified),
  5. @intLastDate := modified
  6. FROM posts ORDER BY modified ASC;
Unises
Dziękuje za zainteresowanie tematem, ale coś mi to nie działa wstydnis.gif
łącze sie z bazą za pomocą takiego narzędzia SQL Server Management Studio Express
tworze jak zwykle new query

daje to:

  1. SET @intLastDate := 0;
  2. SELECT
  3. *,
  4. TIMESTAMPDIFF(MINUTE,@intLastDate,modified),
  5. @intLastDate := modified
  6. FROM czas ORDER BY modified ASC;


i otrzymuje niestety

Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near ':'.
Msg 137, Level 15, State 2, Line 4
Must declare the variable '@intLastDate'.

Nie jestem biegły w MSSQL większość prostych rzeczy robie z doskoku w miarę potrzeb.
Niestety nie wiem jak mu zdeklarować inaczej tą zmienną by ją widział
próbowałem już bez ":" w nawiasach itd ale tez sie wywala sadsmiley02.gif
prond
Mój błąd - ślepo założyłem, że chodzi Tobie o MySQL.
Nie pracowałem za dużo z MSSQL, ale może poszukaj tam funkcji rankingujących, bo to jedyna szansa na zrealizowanie tego zapytania.

A można też tak:
  1. SELECT
  2. Post.*,
  3. (SELECT TIMESTAMPDIFF(MINUTE,MAX(modified),Post.modified) FROM posts tmp WHERE tmp.id <> Post.id AND tmp.modified <= Post.modified) AS diff
  4. FROM posts AS Post
  5. ORDER BY modified;


Tylko to jest mało optymalne.
Unises
Dziękuje za podpowiedz guitar.gif
, będę "grzebał" dalej
, a jeśli chodzi o błąd; to ja zawiniłem niedoprecyzowaniem o jaki typ bazy chodzi.

Cytat
A można też tak:

  1. SELECT
  2. Post.*,
  3. (SELECT TIMESTAMPDIFF(MINUTE,MAX(modified),Post.modified) FROM posts tmp WHERE tmp.id <> Post.id AND tmp.modified <= Post.modified) AS diff
  4. FROM posts AS Post
  5. ORDER BY modified;


Chyba jednak nie

Msg 195, Level 15, State 10, Line 1
'TIMESTAMPDIFF' is not a recognized function name.
prond
No to juz kwestia funkcji do operacji na datach - wyszukaj w manualu 'date and time functions' i pewnie znajdziesz tam odpowiednik MySQL'owego TIMESTAMPDIFF.
Moze tez wystarczy tobie prosta roznica : MAX(modified) - Post.modified
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.