Как сравнить две ДАТЫ, имеющие varchar в качестве типа данных

#php #mysql #sql #database

#php #mysql #sql #База данных

Вопрос:

У меня есть две таблицы table1 и table2

таблица 1 со следующими столбцами (id,date_reg,status)

date_reg — это тип данных varchar, имеющий формат даты, подобный этому (mm-dd-yyyy) .

И table2 со следующими столбцами (id,uname,date_reg)

date_reg — это тип данных varchar, имеющий формат даты, подобный этому (mm-dd-yyyy) .

Мне нужны сопоставленные записи с последней датой (путем сравнения table1.date_reg с table2.date_reg )

Комментарии:

1. Есть ли особая причина date_reg , по которой столбец не является a DATE ?

2. Пожалуйста, покажите примеры данных и желаемые результаты. Вы должны быть в состоянии просто выполнить a join для двух полей, если вы ищете равенство.

3. я думаю, что люди используют to like varchar for date , потому что операция on varchar проста в обращении, чем операция date type

4. Вероятно, вам придется использовать что-то вроде STR_TO_DATE() , но это невероятно быстро обойдется во многих строках. Почему они не хранятся как a DATE ?

5. @rock321987 Иногда то, что поначалу кажется проще, в конечном итоге оказывается гораздо более сложным, раздражающим и громоздким. Часто лучше растянуть немного раньше, а затем иметь возможность использовать уже проделанную работу.

Ответ №1:

Попробуйте это

 SELECT *
FROM table1,
     table2
WHERE STR_TO_DATE(table1.date_reg, '%m/%d/%Y')=STR_TO_DATE(table2.date_reg, '%m/%d/%Y')
 

Комментарии:

1. Это должно было '%m-%d-%Y' бы соответствовать его примеру.

2. Я пробовал это, но все еще не сравнивал должным образом

3. В чем проблема в запросе? Если у вас есть какие-либо ошибки, дайте мне знать.

4. результаты поступают не так, как ожидалось.. Мне нужна недавняя дата от обоих, поэтому я дал вот так CASE WHEN DATE(DATE_FORMAT(table1.date_reg,'%m-%d-%Y 00:00:00')) < DATE(DATE_FORMAT(table2.date_reg,'%m-%d-%Y 00:00:00')) THEN table1.date_reg ELSE table2.date_reg END recentDate

5. любой, как я буду признателен за ваш ответ.

Ответ №2:

Я не знаком с синтаксическим анализом регулярных выражений / текста в PHP, но общей стратегией было бы разделить ваши две строки на ‘-‘, затем сравнить год, затем месяц, а затем день. В псевдокоде:

 if table1.year > table2.year:
    return table1.date
else if table1.year < table2.year:
    return table2.date
else:
    if table1.month > table2.month:
        return table1.date
    else if table2.month > table1.month:
        return table2.date
    else:
        if table1.day > table2.day:
            return table1.date
        else if table2.day > table1.day:
            return table2.date
        else:
            return 0
 

Ответ №3:

используйте следующее, если формат даты одинаков:

выберите * из таблицы1 слева присоединиться к таблице2 НА table1.date_reg = table2.date_reg

или, если вы хотите, чтобы условие where тогда

выберите * из таблицы1 слева присоединиться к таблице2 НА table1.date_reg = table2.date_reg где table1.date=’06-05-2014′

Ответ №4:

Вы могли бы использовать STR_TO_DATE() функцию MySQL, чтобы превратить ваши VARCHAR поля в действительную дату, которую вы можете использовать для сравнения, например:

 STR_TO_DATE(table1.date_reg, '%m-%d-%Y')
 

В идеале, однако, вы не хотите этого делать. Это не решение, это еще одна проблема, которая используется, чтобы попытаться скрыть существующую проблему, ваши даты сохраняются как VARCHAR , а не как DATE .

Вам было бы гораздо лучше изменить свой код импорта, чтобы импортировать даты из Excel (или откуда бы вы ни импортировали) в правильный DATE формат для MySQL. Если вы не уверены, как это сделать, я бы предложил создать новый вопрос с кодом, который вы используете для импорта данных, и спросить, как правильно его отформатировать.