Не получить доступ к значению, используя оператор between в sql

Я храню дату как varchar в базе данных. Когда я пытаюсь получить доступ к некоторым данным с помощью оператора between в sql, чтобы получить некоторые значения между определенными датами, он не дает правильного вывода, потому что я сохранил дату как varchar. Дата имеет формат (01/12/2013)(dd/mm/yyyy).

Любая идея получить доступ к правильным данным, используя оператор between без изменения даты с varchar на формат даты?

Спасибо.


person alenlee    schedule 08.02.2013    source источник
comment
Вы можете по крайней мере использовать to_date в предложении where...   -  person Rahul Vasantrao Kamble    schedule 08.02.2013


Ответы (5)


Не запутайтесь в типе данных - это не имеет никакого отношения к вашей проблеме. Вы увидите это, если убрать / в датах - чтобы получить реальные цифры: 20.02.2013 на самом деле более чем на 21 миллион больше, чем 01.02.2014

20/02/2013 = 20022013
01/02/2014 = 1022014

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

РЕШЕНИЕ 1. Если вы должны оставить все как есть в таблице, вы должны сделать следующее:

Таблица базы данных:

CREATE TABLE `dates` (
  `date_varchar` varchar(15) DEFAULT NULL,
  `date_datetime` datetime DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8

Данные:

date_varchar  date_datetime        
01/02/2013    2013-02-01 00:00:00  
02/02/2013    2013-02-02 00:00:00  
03/02/2013    2013-02-03 00:00:00  
03/02/2014    2014-02-03 00:00:00  
03/03/2013    2013-03-03 00:00:00  
04/02/2013    2013-02-04 00:00:00  
05/02/2013    2013-02-05 00:00:00  

Запрос:

SELECT * 
FROM dates 
WHERE STR_TO_DATE(date_varchar,'%d/%m/%Y') 
BETWEEN '2013-02-03' AND  '2013-02-04'

Вернет две записи:

date_varchar  date_datetime        
03/02/2013    2013-02-03 00:00:00  
04/02/2013    2013-02-04 00:00:00  

РЕШЕНИЕ 2:

Чтобы изменить порядок в varchar на год, месяц, дату в поле. См. данные таблицы ниже:

date_varchar  date_datetime        
2013/02/01    2013-02-01 00:00:00  
2013/02/02    2013-02-02 00:00:00  
2013/02/03    2013-02-03 00:00:00  
2013/02/04    2013-02-04 00:00:00  
2013/02/05    2013-02-05 00:00:00  
2013/03/03    2013-03-03 00:00:00  
2014/02/03    2014-02-03 00:00:00  

Теперь вы можете выбрать:

SELECT * 
FROM dates 
WHERE date_varchar 
BETWEEN '2013/02/02' AND '2013/02/03'

Теперь числа упорядочены так же, как и datetime — вы можете просто убрать / и — чтобы увидеть числа. Таким образом, varchars сортируются так же, как date_time.

Запрос возвращает те же две строки:

date_varchar  date_datetime        
2013/02/02    2013-02-02 00:00:00  
2013/02/03    2013-02-03 00:00:00  

РЕШЕНИЕ 3.

Это не для вас, потому что вы не хотите менять таблицу, но я включаю ее для полноты картины. Изменив тип данных на дату и время, вы вынуждены расположить числа в правильном порядке, и вы используете этот запрос, чтобы получить диапазон между датами:

SELECT * 
FROM dates 
WHERE date_datetime 
BETWEEN '2013-02-03' AND  '2013-02-04'

Те же две записи:

date_varchar  date_datetime        
03/02/2013    2013-02-03 00:00:00  
04/02/2013    2013-02-04 00:00:00  

ПРИМЕР ПРОБЛЕМЫ:

Теперь просто выбирая даты, когда varchar возвращает - как вы уже догадались - те же две записи, что и первый запрос и еще несколько, точно так же, как то, что происходит с вами:

Данные:

date_varchar  date_datetime        
01/02/2013    2013-02-01 00:00:00  
02/02/2013    2013-02-02 00:00:00  
03/02/2013    2013-02-03 00:00:00  
03/02/2014    2014-02-03 00:00:00  
03/03/2013    2013-03-03 00:00:00  
04/02/2013    2013-02-04 00:00:00  
05/02/2013    2013-02-05 00:00:00

SELECT * 
FROM dates 
WHERE date_varchar 
BETWEEN '03/02/2013' AND  '04/02/2013'

date_varchar  date_datetime        
03/02/2013    2013-02-05 00:00:00  
03/02/2014    2014-02-03 00:00:00  
03/03/2013    2013-02-05 00:00:00  
04/02/2013    2013-02-03 00:00:00   
person Bingo    schedule 08.02.2013
comment
Ваш последний запрос также вернет, например. «03.03.2013» и «02.03.2014», если они найдены в таблице. - person Terje D.; 08.02.2013

вы сохраняете дату как varchar, затем используете функцию to_date для преобразования в формат даты, а затем используете между оператором:

Попробуй это

SELECT *
FROM orders
WHERE to_date(order_date, 'dd/mm/yyyy') between to_date ('01/12/2012', 'dd/mm/yyyy')
AND to_date ('31/12/2012', 'dd/mm/yyyy');
person user2001117    schedule 08.02.2013

На всякий случай, если вы используете MS SQL:

SELECT *
FROM orders
WHERE CONVERT(DATETIME,order_date,101) between CONVERT(DATETIME,'01/12/2012',101)
AND CONVERT(DATETIME,'31/12/2012',101);
person Andrey Gordeev    schedule 08.02.2013

В основном вы пытаетесь найти решение, не меняя формат данных, если я не ошибаюсь. Оператор Between не может понять, что данные являются датой, если это явно не указано. Таким образом, вы должны сказать, что это поле является датой. В каждой базе данных есть похожие функции, такие как date(), to_date(). Поскольку я не знаю, какую базу данных вы используете, я не могу дать вам точный синтаксис того, как ее разрешить. Но я уверен, что вы легко найдете его. Дайте мне знать, если вам нужна дополнительная информация.

person PC.    schedule 08.02.2013

просто напишите следующий запрос

select * 
from table 
where str_to_date('01/01/2013','%m%d%Y') between '2012-01-02' and '2013-01-02'
person viswakarthikreddy    schedule 08.02.2013
comment
Добро пожаловать в StackOverflow: если вы публикуете образцы кода, XML или данных, пожалуйста, выделите эти строки в текстовом редакторе и нажмите кнопку образцов кода ( { } ) на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис. ! - person marc_s; 08.02.2013