2015-12-15 4 views
1

У меня есть данные в этом форматеПочему этот запрос возвращает пустые строки?

CREATE TABLE IF NOT EXISTS `historical_data` (
    `symbol_name` varchar(70) DEFAULT NULL, 
    `current_day` varchar(50) DEFAULT NULL, 
    `open_val` varchar(20) DEFAULT NULL, 
    `high_val` varchar(20) DEFAULT NULL, 
    `low_val` varchar(20) DEFAULT NULL, 
    `close_val` varchar(20) DEFAULT NULL, 
    `last_val` varchar(20) DEFAULT NULL, 
    `prevclose_val` varchar(20) DEFAULT NULL, 
    UNIQUE KEY `symbol_name` (`symbol_name`,`current_day`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 


INSERT INTO `historical_data` (`symbol_name`, `current_day`, `open_val`, `high_val`, `low_val`, `close_val`, `last_val`, `prevclose_val`) VALUES 
    ('IBWSL', '10-DEC-2015', '9.35', '9.8', '9', '9.45', '9.6', '9.5'), 
    ('ICICIBANK', '10-DEC-2015', '260.85', '261.9', '256', '258.95', '258.65', '259.45'), 
    ('ICIL', '10-DEC-2015', '981', '1004.2', '981', '989.7', '992', '988.45'), 
    ('ICNX100', '10-DEC-2015', '86.8', '87.99', '86.8', '87', '87', '82.5'), 
    ('ICRA', '10-DEC-2015', '4175', '4280', '4144', '4211.4', '4279.95', '4175.3'), 
    ('ZYDUSWELL', '14-DEC-2015', '815.75', '815.75', '785.25', '810.7', '810.5', '803.1'), 
    ('ZYLOG', '14-DEC-2015', '2.9', '2.95', '2.85', '2.95', '2.95', '2.19'); 
/*!40000 ALTER TABLE `historical_data` ENABLE KEYS */; 

Я написал запрос, таким образом

select * from (
    select 
     symbol_name , 
     (prevclose_val-close_val) as losers, 
     'daily' as `type` 
    from 
     historical_data 
    where 
     current_day >= STR_TO_DATE('14-DEC-2015', '%d-%MMM-%Y') 
    order by losers asc limit 10 
) as sub_daily 

Это мой sqlfiddle

http://sqlfiddle.com/#!9/b4819

+0

Вам не нужно 'STR_TO_DATE()' on' current_day'? –

ответ

2

Использование STR_TO_DATE() функция и потому что вы сохранили дату в качестве столбца varchar в базе данных.

Вы также можете использовать ДАТА в DATATYPE удалить этот тип преобразования даты во всех запросах

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

SELECT * 
FROM (SELECT symbol_name , (prevclose_val-close_val) AS losers,'daily' AS `type` 
     FROM historical_data 
     WHERE STR_TO_DATE(current_day, '%d-%M-%Y') >= STR_TO_DATE('14-DEC-2015', '%d-%M-%Y') 
     ORDER BY losers ASC 
     LIMIT 10 
    ) AS sub_daily; 

Проверьте SQL FIDDLE DEMO

:: ВЫХОД ::

| symbol_name |    losers | type | 
|-------------|---------------------|-------| 
| ZYDUSWELL | -7.600000000000023 | daily | 
|  ZYLOG | -0.7600000000000002 | daily | 
+2

Или еще лучше использовать DATE в качестве типа столбца. И столбцы цитирования должны, вероятно, быть числовыми. –

+0

@ KlasLindbäck Я также предпочитаю, чтобы тип данных DATE использовался для столбца даты. –

+0

@SaharshShah, спасибо большое, еще один запрос с этим я могу найти верхние loosers дня, аналогично можно узнать верхние loosers для недели, основанные на текущих данных. скажите, пожалуйста, как я могу это найти. – Pawan

0

Ваша проблема в том, что вы создали поле current_day как VARCHAR, и оно должно быть DATE.

Также по вашему запросу вы конвертируете только значение для фильтрации в дату, а не в поле.

Таким образом, вы должны исправить вашу таблицу изменения этого поля в ДАТУ сделать это на вашем запросе where фильтра:

В документации MySQL нет формата %MMM либо изменить его на %b который сокращенном месяц или %M месяца имя формата параметр следует формату DATE_FORMAT функции, увидеть его здесь: DATE_FORMAT Formats

select * 
    from (select symbol_name , 
       (prevclose_val-close_val) as losers, 
       'daily' as `type` 
      from historical_data 
     where STR_TO_DATE(current_day, '%d-%b-%Y') >= STR_TO_DATE('14-DEC-2015', '%d-%b-%Y') 
     order by losers asc limit 10 
     ) as sub_daily 

Если преобразовать поле в тип DATE вы можете сделать только:

select * 
    from (select symbol_name , 
       (prevclose_val-close_val) as losers, 
       'daily' as `type` 
      from historical_data 
     where current_day >= '2015-12-14' 
     order by losers asc limit 10 
     ) as sub_daily 
Смежные вопросы