1. 程式人生 > >Mysql生成任意指定兩時間範圍內的日期列表(三種方法)

Mysql生成任意指定兩時間範圍內的日期列表(三種方法)

前言:工作當中有一個場景是資料庫存了一些資料,但是日期是零碎的,只有當用戶進行了相應日期的操作才會有對應記錄的生成。此時有一個需求就是要讓使用者看到哪個日期有操作,哪個日期沒有操作。此時就需要有一個表可以提供一段時間範圍內的所有日期。

在看這篇文章以前呢,得明白幾個知識點,儲存過程(如何建立,如何呼叫,好處是什麼)、變數(如何建立,賦值,使用)、DATE_SUB、DATE_FORMAT、

在網上查詢資料,看到的有三種方法,總結如下

一、建立儲存過程(即建立一個臨時的日曆表。我是這樣理解的),

例一:

以下是我從別人的部落格抄過來的例子,這個例子是將日期範圍寫在建立的邏輯當中,感興趣的夥伴可以試一下執行,當執行了呼叫的語句可以檢視自己資料庫中是否多了一張表。

例二:

這是另外一個建立儲存過程,不同於以上的例子,這個可以直接在呼叫的時候給時間範圍。對於日期範圍需要和使用者互動,需要靈活更改的,這個方法更加適用

DELIMITER $$
DROP PROCEDURE IF EXISTS create_calendar $$
CREATE PROCEDURE create_calendar (s_date DATE, e_date DATE)
BEGIN
 
	SET @createSql = 'CREATE TABLE IF NOT EXISTS calendar (
                      `date` date NOT NULL,
		       UNIQUE KEY `unique_date` (`date`) USING BTREE
                   )ENGINE=InnoDB DEFAULT CHARSET=utf8'; 
	prepare stmt from @createSql; 
	execute stmt; 
 
	WHILE s_date <= e_date DO
		INSERT IGNORE INTO calendar VALUES (DATE(s_date)) ;
		SET s_date = s_date + INTERVAL 1 DAY ;
	END WHILE ; 
 
END$$
DELIMITER ;
 
CALL create_calendar ('2018-03-01', '2018-12-30');

總結:使用儲存過程的優點網上隨便一查就能查到,以上這兩種方式都能生成一張臨時表,裡面存放著你自己指定的時間範圍內的所有日期。根據自己業務需求,可以選取其中一種方法,生成臨時表,再與你的資料進行各種操作得出某段時間範圍內日期齊全的資料。

二、(變數控制)指定資料條數,生成連續的數字或日期

這個標題說得比較抽象了,我自己都不懂自己在表達什麼。看例子吧

例一:

SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL xc MONTH), '%Y-%m') as date
FROM ( 
			SELECT @xi:[email protected]
+1 as xc from (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) xc1, (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) xc2, (SELECT @xi:=0) xc0 ) xcxc

以上程式碼的作用就是生成當月前25(包括當月)個月的日期。具體解釋如下

總結:在如上的例子當中,涉及到的知識點是變數,DATE_SUB(),DATE_FORMAT().使用以上方法的好處就是不用建立儲存過程,也不涉及到任何表。缺點就是資料的條數控制並不靈活,不能和使用者之間形成互動,即不能自定義日期區間,只能控制資料條數。

三、(利用現有的表做操作)

要求是這個表中的資料足夠龐大,好處是不涉及儲存過程,不涉及變數,且能自定義日期區間。

例一:

總結:這個是我選擇的方法,因為業務需要,我不能用建立儲存過程的方法,再加上我需要和使用者做互動,即需要指定日期範圍,而不是資料條數,所以,前兩種方法都被排除了,我就選擇的最後這種。

寫在最後,以上三種方法基本上可以滿足%80以上的夥伴的需求了,根據需要不同,平臺不同,選擇適合自己的方法。如有問題,歡迎指正,感激不盡,望共同進步。

相關推薦

Mysql生成任意指定時間範圍日期列表方法

前言:工作當中有一個場景是資料庫存了一些資料,但是日期是零碎的,只有當用戶進行了相應日期的操作才會有對應記錄的生成。此時有一個需求就是要讓使用者看到哪個日期有操作,哪個日期沒有操作。此時就需要有一個表可以提供一段時間範圍內的所有日期。 在看這篇文章以前呢,得明白幾個知識點,

php獲得一段時間範圍日期列表

//當前日期 $start_date = date("Y-m-d",time()); //本月最後一天日期 $end_date = date('Y-m-d', strtotime("$start_date +1 month -2 day")); //獲得該時間段內所有日期列

C語言編程 求個數的平均值方法方法

輸入 均值 二進制 介紹 運算 use pause can include 第一種方法是最常見的average=(a + b) / 2這種方式,求兩個數的平均值 第二種方法是當 a<b 時averag=a+(b-a)/2 這裏著重介紹的是第三種方法 average=(

Java多執行緒超時範圍等待完成的幾方法

        在工程專案中可能會有這麼一個場景,客戶端處理層需要從服務端(CDN/圖片伺服器)獲取n張圖片(參考微博一個人最多有9張圖片),那麼問題來了,如何在一定的時間範圍內儘可能多的獲取到圖片。當然,最為簡單粗暴的方法就是通過序列的方式來獲取,但是如果第一個請求hang

Java使用默認瀏覽器打開指定URL的方法方法

new space uil 默認瀏覽器 des build process url eat 直接看代碼:方法一: 復制代碼 代碼如下: Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler htt

微信支付支付寶支付生成二維碼的方法php生成二維碼的方法

gpo 就是 contents 微信支付 amp 如何 使用 alt scrip 如果圖簡單,可以用在線生成 http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://www.xinzhenkj.com

C之動態存分配十四

C語言 malloc free calloc realloc 在一般的程序中,我們難免會遇到動態的申請內存,那麽動態內存分配的意義到底是什麽呢?在 C 語言中的一切操作都是基於內存的,變量和數組都是內存的別名。內存分配由編譯器在編譯期間決定,定義數組的時候必須指定數組長度,

根據wsdl反向生成webservice服務端3方法

執行 services web.xml javaee jar -i next 意圖 -a 前言正常情況下,都是我們項目組創建一個webservice服務端,客戶通過我們提供的wsdl地址生成客戶端並進行訪問;但是最近和一個國企做接口對接,他們卻只提供給我們wsdl,需要我們

《程式設計師面試金典》--尋找二叉樹中個節點的第一個公共祖先情況

/**************************************************************************************************

Java 指定執行緒執行順序方式

     方法一:通過共享物件鎖加上可見變數來實現。 public class MyService { private volatile int orderNum = 1; pub

python如何不生成pyc檔案方式

pyc檔案的生成是什麼情況下生成呢: 當 import匯入另一個模組的時候會生成 python3會生成 __pycache__ 如何不生成編譯檔案呢: 1.使用 -B引數 即 python3 -B

c/c++測試函式的執行時間方法

目前,存在著各種計時函式,一般的處理都是先呼叫計時函式,記下當前時間tstart,然後處理一段程式,再呼叫計時函式,記下處理後的時間tend,再tend和tstart做差,就可以得到程式的執行時間,但是各種計時函式的精度不一樣.下面對各種計時函式,做些簡單記錄.

JS:支援任意數量的分組checkbox全選功能方法的比較

用JQ寫的支援任意數量的分組checkbox全選功能的超短程式碼,特點有兩個,一是短,二是擴充套件容易,不需要改動JS,只需要複製一組之後按照命名規則改下編號.   (為書寫簡便,以下都省略了checkbox的value,實際應用中,這當然是必須的,請自行注意新增) <

數求最大公約數的方法的C語言實現

任意輸入兩個數,求出二者的最大公約數,以C語言實現。以下是三種方法以及對應思路: <1>輾轉相除法。 定義兩個變數存放兩個數(a,b),先以冒泡法將較大數存放在在b內,較小數存放於a。 相除法的思路是: 1.b÷a取餘 2.判斷餘數是否為零,若為零,則最大

My97DatePicker:開始時間和結束時間的最大間隔為1個月30天,並且不大於當前時間3方法

/** * author:ls * email:[email protected] * date:2016年1月2日 */ //IE9以下不能使用bind的處理。 if (!Function.prototype.bind) { Function.prototype.bind = functio

MySql 求一段時間範圍的每一天,每一小時,每一分鐘

pda join 月份 nbsp 獲取 pan 關聯 orm now() 平常經常會求一段時間內的每一天統計數據,或者每一時點的統計數據。但是mysql本身是沒有直接獲取時點列表的函數或表。下面是自己用到的一些方法,利用臨時變量和一個已存在的比較多數據(這個需要根據實際情況

判斷指定月份、日期是否在時間範圍

public boolean isInMonthDay(int month, int day, Calendar minCal, Calendar maxCal){ boolean re

mysql 時間範圍分時段分組排序

SELECT nums, count(*) TimesParSum, sum(CHARGE_TOTAL) TimesParSum FROM ( SELECT CASE W

linux獲取日誌指定行數範圍的內容

得到 http rep 不想 code 水流 clas -a 技術分享 假如我要獲取“淺淺歲月拂滿愛人袖”到“落入凡塵傷情著我”之間的內容。 1、首先得到他們所在的行號: -n選項顯示行號 但是有時候grep後顯示的是“匹配到二進制文件(標準輸入)”,說明搜索的字

ES 時間範圍過濾

GET /apps_zego_logs-2018.09.25/_search { "size": 1, "query": { "bool": { "must": [ {"range": { "@timestamp":