2015-08-25 9 views
0

У меня есть запрос, сравнить даты, что-то вроде:Sql Server Дата новообращенного

SELECT * FROM TABLE WHERE MYDATETIME < @DATE 

Столбец MYDATETIME столбец DATETIME, но когда я получаю дату из веб-формы я получаю его в формате даты и создать объект DateTime в PHP:

$date = DateTime::createFromFormat('d/m/Y',$date); 

проблема заключается в том, когда запрос сравнивает даты, которые он использует время суток, а также, но когда я создаю дату в PHP он получает время системы.

Я хотел бы сравнить только дату, а не время суток.

Какой вариант лучше для производительности баз данных, создание объекта в PHP с помощью:

DateTime::createFromFormat('d/m/Y H:i', $date." 00:00"); 

или преобразования в запросе?

SELECT * FROM TABLE WHERE CONVERT(DATE,MYDATETIME) < CONVERT(DATE, @DATE) 
+0

Это может быть серьезным недостаток конструкции. Оставьте свой db с datetime и попробуйте webform нажать дату и время. Boom done – FirebladeDan

+0

Мне нужно время datetime по другим причинам в таблице, но поле в веб-форме должно быть Date, потому что я хочу получать записи для определенного диапазона дат, игнорируя время –

+0

Если вы собираетесь с опцией базы данных (которая Я думаю, что это хорошо), убедитесь, что у вас есть нужные индексы. Если у вас есть индекс в MyDateTime, то его преобразование не будет делать эти индексы. – Sagar

ответ

0

Я думаю, что вы в основном на ходу в своем первоначальном вопросе. Создайте объект DateTime, установите компонент времени на 00:00:00, а затем сравните его непосредственно с полем MYDATETIME в базе данных.

Это может быть сделано, как вы предлагаете, или делать что-то вроде этого:

$datetime = DateTime::createFromFormat('d/m/Y',$date); 
$datetime->setTime(0,0,0); 
$date_string_for_db_compare = $datetime->format('Y-m-d H:i:s'); 
0

Mike является правильным в том, что вам нужно передать переменную в формате по умолчанию поля базы данных. Это даст вам наилучшую производительность из запроса. Всякий раз, когда вы используете функцию cast/convert в поле базы данных, в индексе where where indexing для этого поля не будет использоваться. Я бы добавил к предложению Майкса, что вы используете> = и <, чтобы вы могли захватить все транзакции, которые произошли в течение 24-часового периода.

См. Пример ниже.

SELECT 
    FieldA 
    FieldB, 
    MyDateTime 
FROM 
    TABLE 
WHERE 1=1 
    and MyDateTime >= '2015-08-30 00:00:00' 
    and MyDateTime < '2015-08-31 00:00:00' 

Надеется, что это помогает, Джейсону

Смежные вопросы