2017-01-02 2 views
0

у меня есть два вопроса, используя ниже запроса:Запрос возврата NULL при использовании STR_TO_DATE

  1. этот запрос для выбора списка целей. Я хочу отображать period1 как текст while period2 в качестве значения параметра. Это хорошая практика? Любая уязвимость, когда пользователь может использовать список выбора?
  2. Почему запрос возвращает NULL для периода2?

    select distinct 
         STR_TO_DATE(period, '%Y-%m-%d') as period1, 
         STR_TO_DATE(period, '%Y%m%d') as period2 
    from table 
    
+0

вы не дают достаточно информации. Если вы беспокоитесь об уязвимости, используйте параметризованный запрос. Покажите нам пример данных и ожидаемый результат. \t Пожалуйста, прочитайте [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t И вот отличное место для [** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/), чтобы узнать, как улучшить качество вопроса и получить лучшие ответы. –

ответ

1

Причина для получения NULL лежит в определении STR_TO_DATE:

Если дата, время или значение даты и времени извлекается из ул является незаконным, STR_TO_DATE() возвращает значение NULL и выдает предупреждение. Сервер сканирует str, пытаясь сопоставить с ним формат.

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

Я полагаю, однако, что period на самом деле является DATE (или DATETIME) тип данных, и вы имеете в виду DATE_FORMAT, не STR_TO_DATE, верно? Предполагая это, следующий запрос должен работать:

select DATE_FORMAT(period, '%Y-%m-%d') as period1,DATE_FORMAT(period, '%Y%m%d') as period2 from test 

При использовании этой схемы ...

create table test (
    period date 
); 
insert into test (period) values ("2016-12-01"); 

это дает следующий результат:

period1 | period2 
2016-12-01 | 20161201 
+0

OMG ... Я использовал STR_TO_DATE для всего проекта. Я думал, что функция STR_TO_DATE предназначена для преобразования поля datetime в конкретный формат, который мы хотим ?! .... –

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