如何搜索存储为varchar的日期范围?

时间:2017-12-01 15:23:57

标签: mysql

我有一个表“2017年12月13日 - 2017年12月25日”的主键,它存储为varchar。

我如何查询,以便从2017年1月至12月的搜索条目中获得结果列表?

2 个答案:

答案 0 :(得分:1)

在你的mysql表中将你的varchar转换为2列,如startDate和endDate。

var str =“2017年12月13日 - 2017年12月25日”; var arr = str.split(' - ');

var startDate = new Date(arr [0]); var endDate = new Date(arr [1]);

如果将它们存储到数据库中,则很容易在sql中编写查询。

答案 1 :(得分:0)

您可以将它们存储为单独的日期,如下所示:

CREATE TABLE
  `dates`
(
   `date_id` INT PRIMARY KEY AUTO_INCREMENT,
   `start_date` DATE,
   `end_date` DATE
);

INSERT INTO 
  `dates`
(`start_date`, `end_date`)
VALUES
('2017-12-13', '2017-12-25');

然后,如果您想根据范围进行查询,可以执行以下操作:

SELECT
  DATE_FORMAT(`start_date`, '%M %d, %Y') AS `start_date`,
  DATE_FORMAT(`end_date`, '%M %d, %Y') AS `end_date`
FROM
  `dates`
WHERE
  `start_date` BETWEEN '2017-01-01' AND '2017-12-31';

提供:

start_date         |  end_date
-------------------------------------------
December 13, 2017  |    December 25, 2017

现在......要到达那里,你必须解析现有的记录,所以假设一个表:

CREATE TABLE
  `fixme`
(
   `date_id` VARCHAR(50)
);

INSERT INTO
  `fixme`
VALUES
('December 13, 2017 - December 25, 2017');

您可以将它们拆分为日期并将其插入新表中:

SELECT
  STR_TO_DATE(SUBSTRING_INDEX(`date_id`, ' - ', 1),'%M %d, %Y') AS `start_date`,
  STR_TO_DATE(SUBSTRING(`date_id`, LOCATE(' - ', `date_id`)+2),'%M %d, %Y') AS `end_date`
FROM
  `fixme`;

结果:

start_date | end_date
----------------------
2017-12-13 | 2017-12-25

SQL小提琴:http://sqlfiddle.com/#!9/4101cd/7