MySQL Query, "Kara" Kimden Tarih Aralığı

1 Cevap php

Ben 2 veritabanları var. Bir properties ve diğer dates olduğunu. In dates Ben tarih not available demektir land_id ve (YYYYMMDD'NIN biçiminde) bir tarih ilişkili var.

Ben bir kullanıcı bir başlangıç ​​ve bitiş tarihi belirleyebilirsiniz bir sorgu formüle, ve sonra tarihleri ​​(değil date veritabanında) mevcut olduğu için bir özellik seçmeniz gerekir. Nasıl havayolu ve otel siteleri mantık bu tür yaparsınız? Ben tarih aralığını alarak ve arasındaki tüm gün toplama ve tarihler uyuşmuyor bir sorgu yapıyor ve sonuçları numarasına göre sipariş düşünüyordum, ama ben kolay kolay yoğun bir sorgu dönüşebilecek nasıl görebilirsiniz.

CREATE TABLE IF NOT EXISTS `dates` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `land_id` int(11) NOT NULL,
  `date` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=44 ;

--
-- Dumping data for table `dates`
--

INSERT INTO `dates` (`id`, `land_id`, `date`) VALUES
(43, 1, '20100526'),
(39, 1, '20100522'),
(40, 1, '20100523'),
(41, 1, '20100521'),
(42, 1, '20100525');

1 Cevap

Having the Dates as VARCHAR will make it harder to write a query. I suggest to save the dates as DATE and use the following query. This should help:

SELECT * FROM dates WHERE date NOT BETWEEN '<start_date>' AND '<end_date>'

Bu verilen aralığında olmama tarihleri ​​seçer.

Ben de, VARCHAR ile çalışması için MySQL 5.1. reference bir çözüm bulundu:

SELECT STR_TO_DATE(date,'%Y%m%d') as real_date 
FROM dates WHERE real_date NOT BETWEEN '<start_date>' AND '<end_date>'

Veya

SELECT DATE(date) as real_date 
FROM dates WHERE real_date NOT BETWEEN '<start_date>' AND '<end_date>'

btw: <start_date> ve <end_date> tutucular vardır. Orada beton tarihlerini (YYYY-AA-GG) takın.