擊上方藍字關注我們
今天是SQL知識大全的第五講,主要內容是和時間函數相關,主要包括了常用的時間函數,時間提取函數,時間計算函數以及時間和時間戳之間的轉換。
常用的時間函數
to_date()函數
to_date()函數將字符串的日期轉換為時間格式的日期,轉換后的時間格式可以是如下形式:
格式
意義
YEAR 年的拼寫MM 數字月MONTH 月的全拼MON 月的縮寫DD 數字日DAY 星期的全拼DY 星期的縮寫AM 表示上午或者下午HH24、HH12 12小時制或24小時制?MI 分鐘??SS 秒鐘???
具體示例如下:
SELECT TO_DATE('2006-05-01 19:25:34', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL
SELECT TO_DATE('2006-05-01 19:25', 'YYYY-MM-DD HH24:MI') FROM DUAL
SELECT TO_DATE('2006-05-01 19', 'YYYY-MM-DD HH24') FROM DUAL
SELECT TO_DATE('2006-05-01', 'YYYY-MM-DD') FROM DUAL
SELECT TO_DATE('2006-05', 'YYYY-MM') FROM DUAL
SELECT TO_DATE('2006', 'YYYY') FROM DUAL
current_date()/current_time()
返回當前時間,某年某月某日,current_time()等同于current_date。
SELECT CURDATE()# 返回值:
# '2020-10-09'?
current_timestamp()
current_timestamp()相當于now(),返回當前的時間戳。
時間提取
時間提取函數包括year(),month(),day(),hour(),minute(),second()等,其用法都是一直的,這些函數分別返回 date 的年份,月份,日期,時間等,范圍為1000-9999。當 date 為0時,返回0。
具體示例如下:
SELECT YEAR('98-02-03')
# 返回值 1998
SELECT MONTH('98-02-03')
# 返回值 02
SELECT DAY('98-02-03')
# 返回值 3
時間計算函數
DATEDIFF()
語法:DATEDIFF(expr1,expr2)
DATEDIFF()將返回expr1 - expr2的值,用來表示兩個日期相差的天數。expr1 和 expr2 都是日期或日期時間表達式。運算中只用到了這些值的日期部分。
SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30')
#返回結果
1
date_sub()/date_add()
語法格式:
DATE_ADD(date,INTERVAL expr unit)
DATE_SUB(date,INTERVAL expr unit)
執行日期計算的兩種函數。date 是一個用來指定開始日期的 DATETIME 或 DATE 值。expr 是一種以字符串形式呈現的表達式,用來指定從開始日期增加或減少的間隔值。如果是負的間隔值,則 expr 值的第一個字符是-號。unit 是一個單位關鍵字,用來指定expr表達式應該采取的單位。
INTERVAL 關鍵字與單位說明符都不區分大小寫。
下表列出了每個單位數值所對應的 expr 參數的期望格式。
單位所能取的值期望的expr格式MICROSECOND毫秒SECOND秒MINUTE分HOUR小時DAY日WEEK周MONTH月QUARTER季度YEAR年SECOND_MICROSECOND'秒.毫秒'MINUTE_MICROSECOND'分.毫秒'MINUTE_SECOND'分:秒'HOUR_MICROSECOND'小時.毫秒'HOUR_SECOND'小時:分:秒'HOUR_MINUTE'小時:分'DAY_MICROSECOND'日.毫秒'DAY_SECOND'日 小時:分:秒'DAY_MINUTE'日 小時:分'DAY_HOUR'日 小時'YEAR_MONTH'年-月'
時間戳
時間戳的定義
時間戳是從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數,不考慮閏秒。
UNIX時間戳的0按照ISO 8601規范為 :1970-01-01T00:00:00Z.
一個小時表示為UNIX時間戳格式為:3600秒;一天表示為UNIX時間戳為86400秒,閏秒不計算。
在大多數的UNIX系統中UNIX時間戳存儲為32位,這樣會引發2038年問題或Y2038。
UNIX_TIMESTAMP(date)
若無參數調用,則返回一個 Unix timestamp ('1970-01-01 00:00:00' GMT 之后的秒數) 作為無符號整數,得到當前時間戳 。
若用date 來調用 UNIX_TIMESTAMP(),它會將參數值以'1970-01-01 00:00:00' GMT后的秒數的形式返回。date 可以是一個 DATE 字符串、一個 DATETIME字符串、一個 TIMESTAMP或一個當地時間的YYMMDD或YYYMMDD格式的數字。
例如:
SELECT UNIX_TIMESTAMP() ; (執行時的時間:2009-08-06 10:10:40)
# 1249524739
SELECT UNIX_TIMESTAMP('2009-08-06') ;
# 1249488000
from_unixtime()
from_unixtime(t1,’yyyy-MM-dd HH:mm:ss’)
其中t1是10位的時間戳值,即1970-1-1至今的秒,而13位的所謂毫秒的是不可以的。
對于13位時間戳,需要截取,然后轉換成bigint類型,因為from_unixtime類第一個參數只接受bigint類型。例如:
select from_unixtime(cast(substring(tistmp,1,10) as bigint),’yyyy-MM-dd HH’) tim ,count(*) cn from ttengine_hour_data
where …
SELECT from_unixtime(cast(ts AS bigint))
FROM temptable
參考文章
https://wiki.jikexueyuan.com/project/mysql/useful-functions/time-functions.html
https://baike.baidu.com/item/unix%E6%97%B6%E9%97%B4%E6%88%B3
https://blog.csdn.net/qq_24309787/article/details/81095238
SQL系列文章持續更新中
往期推薦
史上最全的SQL知識點匯總,錯過這次在等一年
SQL知識大全(一):數據庫的語言分類你都知道嗎?
SQL知識大全(二):SQL的基礎知識你都掌握了嗎?
SQL知識大全三):SQL中的字符串處理和條件查詢
SQL知識大全(四):SQL中的數據表關聯
分享數據知識,成就數據理想
日期相關的問題與JavaScript一樣古老。從理論上講,如果不是因為API的許多弱點,可以使用JavaScript的date對象執行日期計算。幸運的是,有一些有用的庫可以為我們節省很多工作。其中之一是date-fns。
一個問題,例如,是與日期對象不同的時區的處理,由于JavaScript使用當前系統時區為基礎。這可能會導致困難,尤其是涉及跨多個時區的應用程序時。月份的表示形式是JavaScript中date對象的另一特性。例如,一月的值指定為0。但是,當涉及到日期和年份時,JavaScript會再次遵循預期的標準,因此,5 號用數字5表示。
當您實現一個使用日期值的應用程序時,您經常會發現必須創建,修改和輸出它們的問題。使用機載JavaScript工具,可以輕松進行創建和輸出。但是,如果日期被修改,例如,如果你想從一個日期減去兩天了,這是不再可能。當然,您可以獲取日期的時間戳,然后減去相應的毫秒數以達到目標日期。該解決方案不容易閱讀和維護,或者特別優雅。由于這個問題,還有更多的問題,過去已經創建了許多庫,以使您更輕松地處理JavaScript中的日期值。市場上最廣泛的解決方案之一是Moment.js。不過,前一陣子已經成為了一個嚴重的競爭對手:
最重要的區別之一是項目名稱,因為fns代表功能。日期FNS的功能,它允許您使用日期值的集合。
與此相反,Moment.js具有面向對象的方法。在這里,您創建一個瞬間 -instance和工作與此對象的方法。當然,這會影響包裝尺寸。
Moment.js默認包含整個界面。您確實可以優化程序包,但這需要其他步驟。在date-fns中,您僅加載真正需要的功能。
不過,在帶有Node.js的后端應用程序中,這無關緊要,因為軟件包大小是一個小問題。您可以使用日期FNS就像Moment.js,在前端的瀏覽器。包裝的大小在這里起決定性作用。
date-fns的開發人員不僅確保將項目劃分為許多小的且很大程度上獨立的功能,而且還確保這些功能是純功能。例如,您傳遞一個日期對象和要添加到addHours函數的小時數。結果,您將獲得一個新的日期對象,其中指定的小時數晚于您輸入的日期。因此,沒有副作用,例如直接修改輸入。
與大多數其他JavaScript庫一樣,date-fns可作為npm軟件包提供,并可通過npm進行安裝。在項目中使用命令npm install date-fns進行操作。該軟件包將作為依賴項自動添加到您的package.json文件中。同樣,您可以將紗線與紗線 添加日期-fns命令一起使用。
您可以使用日期FNS包與CommonJS的模塊系統都和也與ES模塊。在下面的示例中,您使用格式函數輸出當前日期。清單1顯示了如何使用CommonJS模塊系統。
清單1:通過CommonJS模塊化系統集成date-fns
1個
2
3
4
5
const { format } = require('date-fns');
const date = new Date();
console.log(`Heute ist der: ${format(date, 'DD.MM.YYYY')}`);
Node.js的較新版本還支持關鍵字的進口和出口,以進口和出口分別模塊。此時,您可以導入整個date-fns軟件包并訪問所需的功能,也可以利用每個功能在單獨的文件中可用的事實,因此可以單獨導入格式功能。你可以看到這是如何工作清單2所示。
清單2:將date-fns與ES模塊一起使用
1個
2
3
import { format } from 'date-fns/format';
const date = new Date();
console.log(`Heute ist der: ${format(date, 'DD.MM.YYYY')}`);
使用格式,您已經學習了格式化日期值的最重要功能。
您可以使用格式字符串來指定要格式化日期的哪一部分以及如何格式化。
您可以在https://date-fns.org/docs/format中找到可以在格式字符串中使用的各個令牌的全面參考。
除此功能外,您還可以訪問其他輔助功能,例如distanceInWords函數,該函數以可讀形式輸出兩個日期值之間的差。
已經提到的JavaScript中對象日期的漏洞是缺少對日期算術的支持。因此,事不宜遲地執行加法或減法。
date-fns為此提供了許多輔助功能。這些功能通常有一個統一的命名方案:首先,你指定的操作,其次是要與工作單位。
這將導致函數名稱,例如addMinutes或subYears。此類別的所有函數都將日期對象作為第一個參數,將數字作為第二個參數表示要添加或減去的單位數。例如,在一個小時的四分之三添加到當前為止,你可以從清單3使用的代碼。
清單3:使用date-fns的日期算術
1個
2
3
4
5
const { addMinutes, addHours, format } = require('date-fns');
const date = addMinutes(addHours(new Date(), 1), 45);
console.log(format(date, 'DD.MM.YYYY HH:mm'));
日期FNS的比較功能也非常有幫助,在他們的幫助,你可以決定是否一個謊言日期之前或之后另一個,還是在某個日期在于未來或過去。清單4使用isAfter和isFuture函數作為示例來說明它們的用法。
清單4:wit dat-fns的比較
1個
2
3
4
5
6
const { isAfter, isFuture, addHours } = require('date-fns');
const date1 = new Date();
const date2 = addHours(new Date(), 5);
console.log(`Date1 is ${isAfter(date1, date2) ? 'after' : 'before'} Date2`);
console.log(`Date2 is ${isFuture(date2) ? 'not' : ''} in the past`);
該日期FNS包為您提供不僅是簡單的操作,如加,但也更復雜的操作,如areRangesOverlapping功能,你可以用它來確定兩個時間跨度是否重疊。
隨著最小和最大的功能,你可以找到一系列的日期值的最早或最晚日期。
借助compareAsc和compareDsc函數,您還可以對具有日期值的數組進行排序。該函數作為比較函數傳遞給數組的sort方法。清單5是這樣的一個例子。
清單5:對日期值進行排序
1個
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const { compareAsc } = require('date-fns');
const sortedDates = [
new Date(2001, 1, 1),
new Date(2003, 3, 3),
new Date(2002, 2, 2),
].sort(compareAsc);
console.log(sortedDates);
Moment.js或date-fns之類的許多程序包都提供了,您也可以使用本機JavaScript來實現。但是,在這些情況下,源代碼的可讀性受到很大影響。除了更正JavaScript 日期對象的特性之外,這是支持使用這些庫的最重要的論據之一。
這里顯示的日期FNS的可能性僅代表庫中的一小部分,并只給你這個庫的功能范圍的味道。有了眾多擴展,并為應用程序的國際化提供了很好的支持,您下次確定一個應用程序的日期庫時,至少應將date-fns入圍。
最后,開發這么多年我也總結了一套學習Java的資料與面試題,如果你在技術上面想提升自己的話,可以關注我,私信發送領取資料或者在評論區留下自己的聯系方式,有時間記得幫我點下轉發讓跟多的人看到哦。
我們的日常開發工作中,經常會遇到需要計算兩個日期之間差異的情況,比如統計項目的開發周期、計算用戶的訂閱時間等。那么,如何在JavaScript中優雅地實現這個功能呢?
假設你是一名初級前端開發工程師,正在負責一個項目的進度管理系統。項目經理要求你計算每個項目的開發周期,并以月為單位展示在系統中。為了實現這個功能,你需要計算兩個日期之間的月份差異。接下來,我們就來看一下如何實現吧!
首先,我們可以通過計算兩個日期之間的年份差異,并將其轉換為月份差異。然后減去起始日期的月份,再加上結束日期的月份,最終得到兩個日期之間的月份差異。
const monthDiff = (d1, d2) => {
let months;
months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth();
months += d2.getMonth();
return months <= 0 ? 0 : months;
}
const start = new Date(2020, 1, 1); // 項目開始日期
const end = new Date(2020, 5, 1); // 項目結束日期
console.log(monthDiff(start, end)); // 輸出4
months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth();
months += d2.getMonth();
return months <= 0 ? 0 : months;
在實際工作中,這個小技巧可以幫助我們快速計算項目的開發周期。例如,當項目經理詢問某個項目的開發周期時,我們只需輸入項目的開始和結束日期,就能快速得出結果,提升工作效率。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。