Nhận danh sách các ngày giữa hai ngày


91

Sử dụng các hàm mysql tiêu chuẩn là có một cách để viết một truy vấn sẽ trả về danh sách các ngày giữa hai ngày.

Ví dụ: cho 2009-01-01 và 2009-01-13 nó sẽ trả về một bảng một cột với các giá trị:

 2009-01-01 
 2009-01-02 
 2009-01-03
 2009-01-04 
 2009-01-05
 2009-01-06
 2009-01-07
 2009-01-08 
 2009-01-09
 2009-01-10
 2009-01-11
 2009-01-12
 2009-01-13

Chỉnh sửa: Có vẻ như tôi đã không rõ ràng. Tôi muốn TẠO danh sách này. Tôi có các giá trị được lưu trữ trong cơ sở dữ liệu (theo ngày giờ) nhưng muốn chúng được tổng hợp ở một phép nối bên ngoài bên trái thành một danh sách các ngày như trên (tôi đang mong đợi giá trị rỗng từ phía bên phải của một số phép nối này trong một số ngày và sẽ xử lý điều này ).


2
Tôi nghĩ rằng giải pháp tốt nhất được mô tả trong các câu trả lời stackoverflow.com/a/2157776/466677
Marek Gregor

1
Có thể trùng lặp các ngày tạo từ phạm vi ngày
Cees Timmerman

Câu trả lời:


68

Tôi sẽ sử dụng thủ tục được lưu trữ này để tạo các khoảng thời gian bạn cần vào bảng tạm thời có tên time_intervals , sau đó THAM GIA và tổng hợp bảng dữ liệu của bạn với bảng tạm thời time_intervals .

Quy trình có thể tạo ra các khoảng thời gian của tất cả các kiểu khác nhau mà bạn thấy được chỉ định trong đó:

call make_intervals('2009-01-01 00:00:00','2009-01-10 00:00:00',1,'DAY')
.
select * from time_intervals  
.
interval_start      interval_end        
------------------- ------------------- 
2009-01-01 00:00:00 2009-01-01 23:59:59 
2009-01-02 00:00:00 2009-01-02 23:59:59 
2009-01-03 00:00:00 2009-01-03 23:59:59 
2009-01-04 00:00:00 2009-01-04 23:59:59 
2009-01-05 00:00:00 2009-01-05 23:59:59 
2009-01-06 00:00:00 2009-01-06 23:59:59 
2009-01-07 00:00:00 2009-01-07 23:59:59 
2009-01-08 00:00:00 2009-01-08 23:59:59 
2009-01-09 00:00:00 2009-01-09 23:59:59 
.
call make_intervals('2009-01-01 00:00:00','2009-01-01 02:00:00',10,'MINUTE')
. 
select * from time_intervals
.  
interval_start      interval_end        
------------------- ------------------- 
2009-01-01 00:00:00 2009-01-01 00:09:59 
2009-01-01 00:10:00 2009-01-01 00:19:59 
2009-01-01 00:20:00 2009-01-01 00:29:59 
2009-01-01 00:30:00 2009-01-01 00:39:59 
2009-01-01 00:40:00 2009-01-01 00:49:59 
2009-01-01 00:50:00 2009-01-01 00:59:59 
2009-01-01 01:00:00 2009-01-01 01:09:59 
2009-01-01 01:10:00 2009-01-01 01:19:59 
2009-01-01 01:20:00 2009-01-01 01:29:59 
2009-01-01 01:30:00 2009-01-01 01:39:59 
2009-01-01 01:40:00 2009-01-01 01:49:59 
2009-01-01 01:50:00 2009-01-01 01:59:59 
.
I specified an interval_start and interval_end so you can aggregate the 
data timestamps with a "between interval_start and interval_end" type of JOIN.
.
Code for the proc:
.
-- drop procedure make_intervals
.
CREATE PROCEDURE make_intervals(startdate timestamp, enddate timestamp, intval integer, unitval varchar(10))
BEGIN
-- *************************************************************************
-- Procedure: make_intervals()
--    Author: Ron Savage
--      Date: 02/03/2009
--
-- Description:
-- This procedure creates a temporary table named time_intervals with the
-- interval_start and interval_end fields specifed from the startdate and
-- enddate arguments, at intervals of intval (unitval) size.
-- *************************************************************************
   declare thisDate timestamp;
   declare nextDate timestamp;
   set thisDate = startdate;

   -- *************************************************************************
   -- Drop / create the temp table
   -- *************************************************************************
   drop temporary table if exists time_intervals;
   create temporary table if not exists time_intervals
      (
      interval_start timestamp,
      interval_end timestamp
      );

   -- *************************************************************************
   -- Loop through the startdate adding each intval interval until enddate
   -- *************************************************************************
   repeat
      select
         case unitval
            when 'MICROSECOND' then timestampadd(MICROSECOND, intval, thisDate)
            when 'SECOND'      then timestampadd(SECOND, intval, thisDate)
            when 'MINUTE'      then timestampadd(MINUTE, intval, thisDate)
            when 'HOUR'        then timestampadd(HOUR, intval, thisDate)
            when 'DAY'         then timestampadd(DAY, intval, thisDate)
            when 'WEEK'        then timestampadd(WEEK, intval, thisDate)
            when 'MONTH'       then timestampadd(MONTH, intval, thisDate)
            when 'QUARTER'     then timestampadd(QUARTER, intval, thisDate)
            when 'YEAR'        then timestampadd(YEAR, intval, thisDate)
         end into nextDate;

      insert into time_intervals select thisDate, timestampadd(MICROSECOND, -1, nextDate);
      set thisDate = nextDate;
   until thisDate >= enddate
   end repeat;

 END;

Kịch bản dữ liệu ví dụ tương tự ở cuối bài đăng này , nơi tôi đã xây dựng một chức năng tương tự cho SQL Server.


4
Cá nhân tôi đã hy vọng một cái gì đó tương tự như các chuỗi được tạo trong PostgreSQL.
Phillip Whelan vào

Nếu bạn đang tạo dữ liệu một lần, bạn thậm chí có thể sử dụng các bảng vĩnh viễn và sử dụng tập lệnh này để điền vào những ngày còn thiếu.
Bimal Poudel

Tôi đã phải thay đổi dấu phân cách trước câu lệnh thủ tục tạo để làm cho nó hoạt động thông qua phpMyAdmin (để tránh lỗi cú pháp trên câu lệnh khai báo) [code] DECLARE // [/ code]
Defkon1

Giải pháp này rất mạnh mẽ và linh hoạt, hoàn toàn không có trên mariaDB Tôi đang gặp lỗi # 1067 - Giá trị mặc định không hợp lệ cho 'khoảng_thời gian_gửi' khi chạy cuộc gọi make_intervals ('2009-01-01 00:00:00', '2009-01-10 00: 00: 00 ', 1,' NGÀY '); Tôi đang sử dụng phiên bản 5.7.28
shebypereira

28

Đối với MSSQL, bạn có thể sử dụng điều này. Nó là rất nhanh chóng.

Bạn có thể kết thúc điều này trong một hàm có giá trị bảng hoặc proc được lưu trữ và phân tích cú pháp trong ngày bắt đầu và ngày kết thúc dưới dạng các biến.

DECLARE @startDate DATETIME
DECLARE @endDate DATETIME

SET @startDate = '2011-01-01'
SET @endDate = '2011-01-31';

WITH dates(Date) AS 
(
    SELECT @startdate as Date
    UNION ALL
    SELECT DATEADD(d,1,[Date])
    FROM dates 
    WHERE DATE < @enddate
)

SELECT Date
FROM dates
OPTION (MAXRECURSION 0)
GO

2
Việc sử dụng OPTION (MAXRECURSION 0) ở đây là gì?
Shiva

14

Chúng tôi gặp vấn đề tương tự với báo cáo BIRT ở chỗ chúng tôi muốn báo cáo vào những ngày không có dữ liệu. Vì không có mục nhập cho những ngày đó, giải pháp đơn giản nhất cho chúng tôi là tạo một bảng đơn giản lưu trữ tất cả các ngày và sử dụng bảng đó để lấy phạm vi hoặc kết hợp để nhận giá trị bằng không cho ngày đó.

Chúng tôi có một công việc chạy hàng tháng để đảm bảo rằng bảng này sẽ được phổ biến trong 5 năm tới. Bảng được tạo như vậy:

create table all_dates (
    dt date primary key
);

Không nghi ngờ gì nữa, có những cách phức tạp kỳ diệu để thực hiện điều này với các DBMS khác nhau 'nhưng chúng tôi luôn chọn giải pháp đơn giản nhất. Các yêu cầu lưu trữ đối với bảng là tối thiểu và nó làm cho các truy vấn trở nên đơn giản và dễ di chuyển hơn nhiều. Loại giải pháp này hầu như luôn luôn tốt hơn theo quan điểm hiệu suất vì nó không yêu cầu tính toán trên mỗi hàng trên dữ liệu.

Tùy chọn khác (và chúng tôi đã sử dụng tùy chọn này trước đây) là đảm bảo có một mục nhập trong bảng cho mọi ngày. Chúng tôi quét bảng định kỳ và thêm không mục nhập cho ngày và / hoặc thời gian không tồn tại. Đây có thể không phải là một tùy chọn trong trường hợp của bạn, nó phụ thuộc vào dữ liệu được lưu trữ.

Nếu bạn thực sự nghĩ rằng đó là một rắc rối để giữall_dates bảng được điền đầy đủ thông tin , thì một thủ tục được lưu trữ là cách để thực hiện sẽ trả về một tập dữ liệu chứa những ngày đó. Điều này gần như chắc chắn sẽ chậm hơn vì bạn phải tính toán phạm vi mỗi khi nó được gọi thay vì chỉ lấy dữ liệu được tính toán trước từ một bảng.

Tuy nhiên, thành thật mà nói, bạn có thể điền bảng trong 1000 năm mà không gặp bất kỳ sự cố lưu trữ dữ liệu nghiêm trọng nào - 365.000 ngày 16 byte (ví dụ) cộng với một chỉ mục sao chép ngày cộng với 20% chi phí để đảm bảo an toàn, tôi ước tính khoảng khoảng 14 triệu [365.000 * 16 * 2 * 1.2 = 14.016.000 byte]), một bảng nhỏ trong sơ đồ sự vật.


12

Bạn có thể sử dụng các biến người dùng của MySQL như sau:

SET @num = -1;
SELECT DATE_ADD( '2009-01-01', interval @num := @num+1 day) AS date_sequence, 
your_table.* FROM your_table
WHERE your_table.other_column IS NOT NULL
HAVING DATE_ADD('2009-01-01', interval @num day) <= '2009-01-13'

@num là -1 vì bạn thêm vào nó lần đầu tiên sử dụng. Ngoài ra, bạn không thể sử dụng "HAVING date_sequence" vì điều đó làm cho biến người dùng tăng hai lần cho mỗi hàng.


8

Mượn ý tưởng từ câu trả lời này , bạn có thể thiết lập một bảng từ 0 đến 9 và sử dụng bảng đó để tạo danh sách ngày tháng của mình.

CREATE TABLE num (i int);
INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);

select adddate('2009-01-01', numlist.id) as `date` from
(SELECT n1.i + n10.i*10 + n100.i*100 AS id
   FROM num n1 cross join num as n10 cross join num as n100) as numlist
where adddate('2009-01-01', numlist.id) <= '2009-01-13';

Điều này sẽ cho phép bạn tạo một danh sách lên đến 1000 ngày. Nếu bạn cần mở rộng hơn, bạn có thể thêm một kết nối chéo khác vào truy vấn bên trong.


Giải pháp này hoạt động tốt hơn nhiều. Nhưng nó có vấn đề với UNIX_TIMESTAMP () - nó cho kết quả như 1231185600.000000; phần mili giây sau dấu thập phân; while - SELECT UNIX_TIMESTAMP (ADDDATE ('2009-01-01', 0)) AS date; KHÔNG dẫn đến phần đó.
Bimal Poudel

3

Đối với Access (hoặc bất kỳ ngôn ngữ SQL nào)

  1. Tạo một bảng có 2 trường, chúng ta sẽ gọi bảng này tempRunDates: -
    Trường fromDatevà - toDate
    Sau đó chỉ chèn 1 bản ghi có ngày bắt đầu và ngày kết thúc.

  2. Tạo bảng khác: Time_Day_Ref
    - Nhập danh sách ngày tháng (tạo danh sách trong excel dễ dàng) vào bảng này.
    --Tên trường trong trường hợp của tôi là Greg_Dt, cho Gregorian Date
    --Tôi đã lập danh sách từ tháng 1 năm 2009 đến tháng 1 năm 2020.

  3. Chạy truy vấn:

    SELECT Time_Day_Ref.GREG_DT
    FROM tempRunDates, Time_Day_Ref
    WHERE Time_Day_Ref.greg_dt>=tempRunDates.fromDate And greg_dt<=tempRunDates.toDate;

Dễ dàng!


2

Thông thường người ta sẽ sử dụng một bảng số phụ mà bạn thường giữ cho mục đích này với một số biến thể về điều này:

SELECT *
FROM (
    SELECT DATEADD(d, number - 1, '2009-01-01') AS dt
    FROM Numbers
    WHERE number BETWEEN 1 AND DATEDIFF(d, '2009-01-01', '2009-01-13') + 1
) AS DateRange
LEFT JOIN YourStuff
    ON DateRange.dt = YourStuff.DateColumn

Tôi đã thấy các biến thể với các hàm có giá trị bảng, v.v.

Bạn cũng có thể giữ một danh sách ngày tháng cố định. Chúng tôi có điều đó trong kho dữ liệu cũng như danh sách các thời điểm trong ngày.



2
CREATE FUNCTION [dbo].[_DATES]
(
    @startDate DATETIME,
    @endDate DATETIME
)
RETURNS 
@DATES TABLE(
    DATE1 DATETIME
)
AS
BEGIN
    WHILE @startDate <= @endDate
    BEGIN 
        INSERT INTO @DATES (DATE1)
            SELECT @startDate   
    SELECT @startDate = DATEADD(d,1,@startDate) 
    END
RETURN
END

2

Giải pháp thanh lịch sử dụng chức năng đệ quy mới (Biểu thức bảng chung) trong MariaDB> = 10.3 và MySQL> = 8.0.

WITH RECURSIVE t as (
    select '2019-01-01' as dt
  UNION
    SELECT DATE_ADD(t.dt, INTERVAL 1 DAY) FROM t WHERE DATE_ADD(t.dt, INTERVAL 1 DAY) <= '2019-04-30'
)
select * FROM t;

Ở trên trả về bảng ngày từ '2019-01-01' đến '2019-04-30'.


"select '2019-01-01' as dt" bộ chọn này là gì? Có thể chỉ chọn một trường từ và đến không?
Miguel Stevens

1

Chúng tôi đã sử dụng điều này trong Hệ thống HRMS của mình, bạn sẽ thấy nó hữu ích

SELECT CAST(DAYNAME(daydate) as CHAR) as dayname,daydate
    FROM
    (select CAST((date_add('20110101', interval H.i*100 + T.i*10 + U.i day) )as DATE) as daydate
      from erp_integers as H
    cross
      join erp_integers as T
    cross
      join erp_integers as U
     where date_add('20110101', interval H.i*100 + T.i*10 + U.i day ) <= '20110228'
    order
        by daydate ASC
        )Days

1

Giải pháp này đang hoạt động với MySQL 5.0
Tạo bảng - mytable.
Lược đồ không quan trọng. Điều quan trọng là số hàng trong đó.
Vì vậy, bạn có thể chỉ giữ một cột kiểu INT với 10 hàng, giá trị - 1 đến 10.

SQL:

set @tempDate=date('2011-07-01') - interval 1 day;
select
date(@tempDate := (date(@tempDate) + interval 1 day)) as theDate
from mytable x,mytable y
group by theDate
having theDate <= '2011-07-31';

Giới hạn: Số ngày tối đa được trả về bởi truy vấn trên sẽ là
(rows in mytable)*(rows in mytable) = 10*10 = 100.

Bạn có thể tăng phạm vi này bằng cách thay đổi phần biểu mẫu trong sql:
từ mytable x, mytable y, mytable z
Vì vậy, phạm vi được 10*10*10 =1000và v.v.


0

Tạo một thủ tục được lưu trữ có hai tham số a_begin và a_end. Tạo một bảng tạm thời bên trong nó có tên là t, khai báo một biến d, gán a_begin cho d, và chạy một WHILEvòng lặp nhập INSERTd vào t và gọi ADDDATEhàm để tăng giá trị d. Cuối cùng SELECT * FROM t.


Trên thực tế, tôi tin rằng một bảng cố định sẽ tốt hơn cho tốc độ thực thi (có yêu cầu lưu trữ tối thiểu). Việc tính toán trước các ngày vào một bảng và trích xuất khi cần thiết sẽ nhanh hơn là tạo phạm vi mỗi khi bạn cần.
paxdiablo

@Pax, nó phụ thuộc vào việc cải thiện tốc độ đạt được có đáng để bảo trì hay không. Ví dụ: nếu quá trình tạo báo cáo mất 3 giây và chạy vòng lặp WHILE để tạo ngày tháng mất 0,001 giây, tôi cho rằng mức tăng hiệu suất là có thể bỏ qua. Knuth: Tối ưu hóa sớm là gốc rễ của mọi điều xấu.
Eugene Yokota

@ eed3si9n, tối ưu hóa sớm, vâng, không phải tất cả tối ưu hóa :-) Nếu ví dụ của bạn là đúng thì có, tôi đồng ý với bạn, nhưng nó nên được đo cho chắc chắn. Bảng bảo trì sẽ biến mất nếu bạn tạo ra nó 1000 năm (chi phí một lần) như tôi đã đề xuất nhưng những giây đó sẽ cộng lại.
paxdiablo

0

Tôi sẽ sử dụng một cái gì đó tương tự như thế này:

DECLARE @DATEFROM AS DATETIME
DECLARE @DATETO AS DATETIME
DECLARE @HOLDER TABLE(DATE DATETIME)

SET @DATEFROM = '2010-08-10'
SET @DATETO = '2010-09-11'

INSERT INTO
    @HOLDER
        (DATE)
VALUES
    (@DATEFROM)

WHILE @DATEFROM < @DATETO
BEGIN

    SELECT @DATEFROM = DATEADD(D, 1, @DATEFROM)
    INSERT 
    INTO
        @HOLDER
            (DATE)
    VALUES
        (@DATEFROM)
END

SELECT 
    DATE
FROM
    @HOLDER

Sau đó, @HOLDERbảng Biến giữ tất cả các ngày tăng dần theo ngày giữa hai ngày đó, sẵn sàng tham gia vào nội dung trái tim của bạn.


Xin chào, tôi đang cố gắng sử dụng mã và chèn đầu ra vào bảng mà tôi đã xác định DateTest với cột ngày điền kiểu DATETIME ... nhưng không thành công ... bạn có thể vui lòng cung cấp mã phù hợp với điều đó không? Lưu ý: Sử dụng SQL Server ở đây Cảm ơn :)
sys_debug

0

Tôi đã đấu tranh với điều này trong một thời gian khá dài. Vì đây là lần đầu tiên xuất hiện trên Google khi tôi tìm kiếm giải pháp, hãy để tôi đăng bài viết mà tôi đã đạt được cho đến nay.

SET @d := '2011-09-01';
SELECT @d AS d, cast( @d := DATE_ADD( @d , INTERVAL 1 DAY ) AS DATE ) AS new_d
  FROM [yourTable]
  WHERE @d <= '2012-05-01';

Thay thế [yourTable]bằng một bảng từ cơ sở dữ liệu của bạn. Bí quyết là số hàng trong bảng bạn chọn phải> = số ngày bạn muốn được trả lại. Tôi đã thử sử dụng trình giữ chỗ bảng DUAL, nhưng nó sẽ chỉ trả về một hàng duy nhất.


1
Cách tiếp cận thú vị. Nhưng .. thực chất đây không phải là những gì Vihang đề xuất ở trên;)?
Leigh

0
select * from table_name where col_Date between '2011/02/25' AND DATEADD(s,-1,DATEADD(d,1,'2011/02/27'))

Ở đây, trước tiên hãy thêm một ngày vào endDate hiện tại, nó sẽ là 2011-02-28 00:00:00, sau đó bạn trừ đi một giây để tạo ngày kết thúc 2011-02-27 23:59:59. Bằng cách này, bạn có thể nhận được tất cả các ngày giữa các khoảng thời gian nhất định.

sản lượng:
2011/02/25
2011/02/26
2011/02/27


0
DELIMITER $$  
CREATE PROCEDURE popula_calendario_controle()
   BEGIN
      DECLARE a INT Default 0;
      DECLARE first_day_of_year DATE;
      set first_day_of_year = CONCAT(DATE_FORMAT(curdate(),'%Y'),'-01-01');
      one_by_one: LOOP
         IF dayofweek(adddate(first_day_of_year,a)) <> 1 THEN
            INSERT INTO calendario.controle VALUES(null,150,adddate(first_day_of_year,a),adddate(first_day_of_year,a),1);
         END IF;
         SET a=a+1;
         IF a=365 THEN
            LEAVE one_by_one;
         END IF;
      END LOOP one_by_one;
END $$

thủ tục này sẽ chèn tất cả các ngày từ đầu năm đến nay, chỉ cần thay thế các ngày bằng "bắt đầu" và "kết thúc", và bạn đã sẵn sàng!


Đường IF a=365 THENbị ảnh hưởng như thế nào bởi các năm nhuận?
Stewart

Ngoài ra, ý nghĩa của số 150trên dòng 9 là gì? Mã này là một "câu trả lời vỗ về" mà không có nhiều giải thích thực tế.
Stewart

0

Tôi cần một danh sách có tất cả các tháng giữa 2 ngày để thống kê. Hai ngày là ngày bắt đầu và ngày kết thúc của một đăng ký. Vì vậy, danh sách hiển thị tất cả các tháng và số lượng đăng ký mỗi tháng.

MYSQL

CREATE PROCEDURE `get_amount_subscription_per_month`()
BEGIN
   -- Select the ultimate start and enddate from subscribers
   select @startdate := min(DATE_FORMAT(a.startdate, "%Y-%m-01")), 
          @enddate := max(DATE_FORMAT(a.enddate, "%Y-%m-01")) + interval 1 MONTH
   from subscription a;

   -- Tmp table with all months (dates), you can always format them with DATE_FORMAT) 
   DROP TABLE IF EXISTS tmp_months;
   create temporary table tmp_months (
      year_month date,
      PRIMARY KEY (year_month)
   );


   set @tempDate=@startdate;  #- interval 1 MONTH;

   -- Insert every month in tmp table
   WHILE @tempDate <= @enddate DO
     insert into tmp_months (year_month) values (@tempDate);
     set @tempDate = (date(@tempDate) + interval 1 MONTH);
   END WHILE;

   -- All months
   select year_month from tmp_months;

   -- If you want the amount of subscription per month else leave it out
   select mnd.year_month, sum(subscription.amount) as subscription_amount
   from tmp_months mnd
   LEFT JOIN subscription ON mnd.year_month >= DATE_FORMAT(subscription.startdate, "%Y-%m-01") and mnd.year_month <= DATE_FORMAT(subscription.enddate, "%Y-%m-01")
   GROUP BY mnd.year_month;

 END

0

Bạn có thể sử dụng cái này

SELECT CAST(cal.date_list AS DATE) day_year
FROM (
  SELECT SUBDATE('2019-01-01', INTERVAL 1 YEAR) + INTERVAL xc DAY AS date_list
  FROM (
        SELECT @xi:=@xi+1 as xc from
        (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc1,
        (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc2,
        (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc3,
        (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc4,
        (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc5,
        (SELECT @xi:=-1) xc0
    ) xxc1
) cal
WHERE cal.date_list BETWEEN '2019-01-01' AND '2019-12-31'
ORDER BY cal.date_list DESC;


-2

tôi đang dùng Server version: 5.7.11-log MySQL Community Server (GPL)

Bây giờ chúng ta sẽ giải quyết điều này một cách đơn giản.

Tôi đã tạo một bảng có tên "datetable"

mysql> describe datetable;
+---------+---------+------+-----+---------+-------+
| Field   | Type    | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+-------+
| colid   | int(11) | NO   | PRI | NULL    |       |
| coldate | date    | YES  |     | NULL    |       |
+---------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

bây giờ, một chút sẽ thấy các bản ghi được chèn vào bên trong.

mysql> select * from datetable;
+-------+------------+
| colid | coldate    |
+-------+------------+
|   101 | 2015-01-01 |
|   102 | 2015-05-01 |
|   103 | 2016-01-01 |
+-------+------------+
3 rows in set (0.00 sec)

và đây là truy vấn của chúng tôi để tìm nạp các bản ghi trong vòng hai ngày thay vì những ngày đó.

mysql> select * from datetable where coldate > '2015-01-01' and coldate < '2016-01-01';
+-------+------------+
| colid | coldate    |
+-------+------------+
|   102 | 2015-05-01 |
+-------+------------+
1 row in set (0.00 sec)

hy vọng điều này sẽ giúp nhiều người.


Bị phản đối, không có bất kỳ lý do gì, SQL này vẫn ổn và đang trong tình huống hoạt động.
ArifMustafa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.