@didxga: Uwaga: (end - start) NIE zwraca sekundowej różnicy między wartościami daty i godziny. Zwraca liczbę będącą różnicą między liczbami dziesiętnymi, które wyglądają jak rrrrmmddggmmss.
helloPiers
Odpowiedzi:
329
SELECT TIMEDIFF('2007-12-31 10:02:00','2007-12-30 12:01:01');-- result: 22:00:59, the difference in HH:MM:SS formatSELECT TIMESTAMPDIFF(SECOND,'2007-12-30 12:01:01','2007-12-31 10:02:00');-- result: 79259 the difference in seconds
Co dokładnie oznacza „różnica w sekundach w dniach”? Nie rozumiem, dlaczego pomnożenie wyniku TIMEDIFFprzez przez 24*60*60nie jest równe wyniku TIMESTAMPDIFF.
David Tuite
To rozwiązanie zadziałało dla mnie! Ale w moim przypadku chciałbym wykonać TIMESTAMPDIFF w DAY, ale nie biorąc pod uwagę weekendów (sobota / słońce). To znaczy tylko różnica dni tygodnia ... Czy to możliwe w prosty sposób? Jeśli nie, przepraszam za niedogodności, poszukam innego rozwiązania. TKs.
Massa
8
TIMEDIFF w przykładzie jest niepoprawny, ponieważ nie jest to liczba sekund między tymi dwoma dniami. TIMEDIFF zwraca wartość CZAS, która zawiera godziny, minuty i sekundy różnicy. Pomnożenie go nie przyniesie użytecznej odpowiedzi. Użyj TIMESTAMPDIFF.
IvanD
4
Ciekawe, że TIMEDIFF()oczekuje się , że argumenty dotyczące czasu rozpoczęcia i zakończenia będą w odwrotnej kolejności niż można się spodziewać TIMESTAMPDIFF().
Jeśli pracujesz z kolumnami DATE (lub możesz je rzutować jako kolumny dat), spróbuj DATEDIFF (), a następnie pomnóż przez 24 godziny, 60 minut, 60 sekund (ponieważ DATEDIFF zwraca różnicę w dniach). Z MySQL:
szanowni państwo, jest idealny na powyższe pytanie, ale chcę trochę modyfikacji z tym samym zapytaniem, więc pomóżcie mi, jak to osiągnąć. tutaj chcę porównać wynik końcowy z moją wartością, na przykład SELECT * FROM table where datediff(today,databasedate) as days =3;coś takiego
Sooraj Abbasi
9
SELECT TIMESTAMPDIFF(HOUR,NOW(),'2013-05-15 10:23:23')
calculates difference in hour.(for days--> you have to define day replacing hour
SELECT DATEDIFF('2012-2-2','2012-2-1')SELECT TO_DAYS ('2012-2-2')-TO_DAYS('2012-2-1')
unix_timestamp - standardowy sposób pomiaru czasu w systemach uniksopodobnych. Reprezentuje 32-bitową liczbę całkowitą, wskazującą, ile sekund minęło od 01/01/1970 00:00:00. To znaczy dolna granica. Górna granica jest ograniczona do 2106 rocznie, ale z powodu częstych programów nie działa z tą wartością (zamiast liczby całkowitej bez znaku używającej liczby całkowitej ze znakiem) jest uważana za górną granicę w 2038 roku.
Devid G
+ podczas przejazdu przez czas letni jest nieprawidłowo odejmowany / dodawany
TC chce uzyskać wartość wyników w sekundach lub milisekundach.
Devid G
0
Ta funkcja przyjmuje różnicę między dwiema datami i wyświetla ją w formacie daty rrrr-mm-dd. Wystarczy, że wykonasz poniższy kod, a następnie skorzystasz z funkcji. Po wykonaniu możesz go używać w ten sposób
Ten kod oblicza różnicę między dwiema datami w formacie rrrr MM dd.
declare@StartDate datetime
declare@EndDate datetime
declare@years int
declare@months int
declare@days int
--NOTE: date of birth must be smaller than As on date, --else it could produce wrong resultsset@StartDate ='2013-12-30'--birthdateset@EndDate = Getdate()--current datetime--calculate yearsselect@years = datediff(year,@StartDate,@EndDate)--calculate months if it's value is negative then it --indicates after __ months; __ years will be complete--To resolve this, we have taken a flag @MonthOverflow...declare@monthOverflow int
select@monthOverflow =casewhen datediff(month,@StartDate,@EndDate)-( datediff(year,@StartDate,@EndDate)*12)<0then-1else1end--decrease year by 1 if months are Overflowedselect@Years =casewhen@monthOverflow <0then@years-1 else@years endselect@months = datediff(month,@StartDate,@EndDate)-(@years *12)--as we do for month overflow criteria for days and hours --& minutes logic will followed same waydeclare@LastdayOfMonth int
select@LastdayOfMonth = datepart(d,DATEADD
(s,-1,DATEADD(mm, DATEDIFF(m,0,@EndDate)+1,0)))select@days =casewhen@monthOverflow<0and
DAY(@StartDate)> DAY(@EndDate)then@LastdayOfMonth +(datepart(d,@EndDate)- datepart(d,@StartDate))-1else datepart(d,@EndDate)- datepart(d,@StartDate)endselect@Months=casewhen@days <0or DAY(@StartDate)> DAY(@EndDate)then@Months-1 else@Months endDeclare@lastdayAsOnDate int;set@lastdayAsOnDate = datepart(d,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@EndDate),0)));Declare@lastdayBirthdate int;set@lastdayBirthdate = datepart(d,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@StartDate)+1,0)));if(@Days <0)(select@Days =casewhen(@lastdayBirthdate >@lastdayAsOnDate)then@lastdayBirthdate +@Days
else@lastdayAsOnDate +@Days
end)printconvert(varchar,@years)+' year(s), '+convert(varchar,@months)+' month(s), '+convert(varchar,@days)+' day(s) '
Dlaczego nie po prostu użyć TIMESTAMPDIFF funkcji?
codeforester
0
Jeśli masz datę zapisaną w polu tekstowym jako ciąg znaków, możesz zaimplementować ten kod, który pobierze listę ostatnich dni w tygodniu, miesiącu lub roku, sortowanie:
SELECT*FROM`table`WHERE STR_TO_DATE(mydate,'%d/%m/%Y')< CURDATE()- INTERVAL 30 DAY AND STR_TO_DATE(date,'%d/%m/%Y')> CURDATE()- INTERVAL 60 DAY
//This isfor a month
SELECT*FROM`table`WHERE STR_TO_DATE(mydate,'%d/%m/%Y')< CURDATE()- INTERVAL 7 DAY AND STR_TO_DATE(date,'%d/%m/%Y')> CURDATE()- INTERVAL 14 DAY
//This isfor a week
% d% m% Y to Twój format daty
To zapytanie wyświetla rekord między dniami, które tam ustawiłeś, na przykład: poniżej z ostatnich 7 dni i powyżej z ostatnich 14 dni, więc będzie to twój rekord z ostatniego tygodnia, aby wyświetlić tę samą koncepcję dla miesiąca lub roku. Bez względu na to, jaką wartość podasz w poniższej dacie, na przykład: poniżej z 7 dni, więc druga wartość byłaby podwojona jako 14 dni. To, o czym tutaj mówimy, obejmuje wszystkie rekordy powyżej z ostatnich 14 dni i poniżej z ostatnich 7 dni. To jest rekord tygodnia, który możesz zmienić na 30-60 dni na miesiąc, a także na rok.
Uwaga: (end - start) NIE zwraca różnicy sekund między wartościami daty i godziny. Zwraca liczbę będącą różnicą między liczbami dziesiętnymi, które wyglądają jak rrrrmmddggmmss.
To nie zwraca różnicy dat w sekundach, zamiast tego zwraca różnicę między liczbami dziesiętnymi, które wyglądają jak rrrrmmddggmmss. Więc to nie rozwiązuje pytania OP. To samo zostało wspomniane w komentarzu do pytania.
Odpowiedzi:
Możesz więc użyć
TIMESTAMPDIFF
do swojego celu.źródło
TIMEDIFF
przez przez24*60*60
nie jest równe wynikuTIMESTAMPDIFF
.TIMEDIFF()
oczekuje się , że argumenty dotyczące czasu rozpoczęcia i zakończenia będą w odwrotnej kolejności niż można się spodziewaćTIMESTAMPDIFF()
.Jeśli pracujesz z kolumnami DATE (lub możesz je rzutować jako kolumny dat), spróbuj DATEDIFF (), a następnie pomnóż przez 24 godziny, 60 minut, 60 sekund (ponieważ DATEDIFF zwraca różnicę w dniach). Z MySQL:
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
na przykład:
źródło
DATEDIFF
nie zwraca ułamków.Uzyskaj różnicę dat w dniach za pomocą DATEDIFF
LUB
Zobacz poniższy link MySql różnica między dwoma znacznikami czasu w dniach?
źródło
SELECT * FROM table where datediff(today,databasedate) as days =3;
coś takiegoźródło
źródło
Drugie podejście
SELECT ( DATEDIFF('1993-02-20','1993-02-19')*( 24*60*60) )AS 'seccond';
źródło
Lub możesz użyć funkcji TIMEDIFF
źródło
Ta funkcja przyjmuje różnicę między dwiema datami i wyświetla ją w formacie daty rrrr-mm-dd. Wystarczy, że wykonasz poniższy kod, a następnie skorzystasz z funkcji. Po wykonaniu możesz go używać w ten sposób
źródło
OK, nie do końca o to prosił OP, ale chciałem to zrobić :-)
źródło
Ten kod oblicza różnicę między dwiema datami w formacie rrrr MM dd.
źródło
TIMESTAMPDIFF
funkcji?Jeśli masz datę zapisaną w polu tekstowym jako ciąg znaków, możesz zaimplementować ten kod, który pobierze listę ostatnich dni w tygodniu, miesiącu lub roku, sortowanie:
% d% m% Y to Twój format daty
To zapytanie wyświetla rekord między dniami, które tam ustawiłeś, na przykład: poniżej z ostatnich 7 dni i powyżej z ostatnich 14 dni, więc będzie to twój rekord z ostatniego tygodnia, aby wyświetlić tę samą koncepcję dla miesiąca lub roku. Bez względu na to, jaką wartość podasz w poniższej dacie, na przykład: poniżej z 7 dni, więc druga wartość byłaby podwojona jako 14 dni. To, o czym tutaj mówimy, obejmuje wszystkie rekordy powyżej z ostatnich 14 dni i poniżej z ostatnich 7 dni. To jest rekord tygodnia, który możesz zmienić na 30-60 dni na miesiąc, a także na rok.
Dziękuję Mam nadzieję, że to komuś pomoże.
źródło
Po prostu zrobiłbyś to:
źródło
Dlaczego nie po prostu
Wybierz Sumę (Data1 - Data2) z tabeli
data1 i data2 to data i godzina
źródło