MySql разница между двумя отметками времени в днях?

Как я могу узнать разницу между двумя отметками времени в днях? Должен ли я использовать для этого столбец datetime?


Я переключил свой столбец на datetime. Кажется, простое вычитание не дает мне результата за несколько дней.

mysql> SELECT NOW(), last_confirmation_attempt, NOW() - last_confirmation_attempt AS diff  FROM DateClubs HAVING diff IS NOT NULL ;
+---------------------+---------------------------+-----------------+
| NOW()               | last_confirmation_attempt | diff            |
+---------------------+---------------------------+-----------------+
| 2010-03-30 10:52:31 | 2010-03-16 10:41:47       | 14001084.000000 |
+---------------------+---------------------------+-----------------+
1 row in set (0.00 sec)

Я не думаю, что diff находится в секундах, потому что, когда я делю diff на количество секунд в день (86 400), я не получаю разумного ответа:

mysql> SELECT NOW(), last_confirmation_attempt, ( NOW() - last_confirmation_attempt) / 86400 AS diff  FROM DateClubs HAVING diff IS NOT NULL ;
+---------------------+---------------------------+----------------+
| NOW()               | last_confirmation_attempt | diff           |
+---------------------+---------------------------+----------------+
| 2010-03-30 10:58:58 | 2010-03-16 10:41:47       | 162.0568402778 |
+---------------------+---------------------------+----------------+
1 row in set (0.00 sec)

person user151841    schedule 30.03.2010    source источник
comment
Какой тип данных у ваших столбцов / значений в настоящий момент?   -  person Andy Shellam    schedule 30.03.2010
comment
Я использовал временные метки, но я просто изменил один столбец на datetime.   -  person user151841    schedule 30.03.2010


Ответы (6)


Если вы предпочитаете игнорировать временную часть в столбцах, DATEDIFF () даст вам разницу в днях, которую вы ищете.

SELECT DATEDIFF('2010-10-08 18:23:13', '2010-09-21 21:40:36') AS days;
+------+
| days |
+------+
|   17 |
+------+
person Uncle Arnie    schedule 30.03.2010
comment
Я также искал в Google, как найти разницу между текущей датой, так что пусть она будет здесь: DATEDIFF(CURDATE(), '2015-04-18'). - person ivkremer; 18.04.2015

Я знаю, что он довольно старый, но я скажу просто ради - я искал ту же проблему и попал сюда, но мне нужна была разница в днях.

Я использовал SELECT (UNIX_TIMESTAMP(DATE1) - UNIX_TIMESTAMP(DATE2))/60/60/24 Unix_timestamp, возвращающий разницу в секундах, а затем я просто делю на минуты (секунды / 60), часы (минуты / 60), дни (часы / 24).

person Enrico    schedule 23.03.2012
comment
Правильно ли это учитывает високосные годы? - person user151841; 27.03.2012
comment
Да, потому что метка времени обрабатывает високосные годы. Разница в отметках времени возвращает разницу между двумя датами в секундах. Если вы разделите до дня, все в порядке (каждый день в году имеет одинаковое количество секунд). - person Enrico; 11.05.2012
comment
@Enrico - Неправда. В некоторые дни есть дополнительная секунда или две секунды в зависимости от года. Это происходит либо в полночь 30 июня, либо в полночь 31 декабря. Это дополнительные секунды, которые корректируют разницу между секундами среднего солнечного дня и секундой атомных часов. Если вы проверите калькуляторы UNIX и SQL, они дадут 62-секундную минуту, что означает, что значения секунд могут находиться в диапазоне от 0 до 61 включительно. Регулировка также может быть отрицательной на две секунды, но этого никогда не происходило, поскольку дрейф всегда в сторону необходимости положительных дополнительных секунд. Стандарт позволяет до 2 секунд. - person Jim; 28.01.2015
comment
@ Джим, я никогда не сталкивался с этим. Спасибо за совет! - person Enrico; 03.02.2015
comment
@Enrico - еще одна вещь, о которой следует подумать, - это наличие 23 и 25 часового дня в некоторых системах гражданского времени. В UTC этого никогда не было, но в системах гражданского времени Северной Америки и большей части Европы (по крайней мере) также есть 23 и 25 часовых дней, когда часы переводятся на так называемое летнее или летнее время или наоборот. Правила того, когда наступит 23- или 25-часовой рабочий день, могут быть сложными. Это встроено в системы времени UNIX и SQL. UTC никогда не соблюдает 23- или 25-часовой рабочий день, но все же имеет вышеупомянутые дополнительные секунды. - person Jim; 08.03.2015

Если вы хотите вернуться в полном формате TIMESTAMP, попробуйте: -

 SELECT TIMEDIFF(`call_end_time`, `call_start_time`) as diff from tablename;

вернуться как

     diff
     - - -
    00:05:15
person Kamlesh    schedule 11.02.2015

Если вам нужна разница в днях с учетом до секунды:

SELECT TIMESTAMPDIFF(SECOND,'2010-09-21 21:40:36','2010-10-08 18:23:13')/86400 AS diff

Он вернет
diff
16.8629

person Makulit A. Ko    schedule 01.08.2017

SELECT DATEDIFF( now(), '2013-06-20' );

здесь dateiff принимает два аргумента: 'upto-date', 'from-date'

Что я сделал, так это то, что с помощью функции now () я не могу получить "нет". дней с 20 июня 2013 года по сегодняшний день.

person Arvind Kumar    schedule 25.06.2013

ВЫБЕРИТЕ DATEDIFF (max_date, min_date) как дни из моей таблицы. Это работает, даже если столбцы max_date и min_date относятся к строковым типам данных.

person Amit Bhat    schedule 20.12.2017