SQL DATEDIFF()函数
SQL中的 DATEDIFF() 函数是一个内置函数,用于返回两个日期或时间之间的差异(作为带符号的整数值)。
此函数接受三个参数:测量的间隔类型(例如年、季度、月、小时、分钟等)、指定要测量期间开始的起始日期或时间,以及指定要测量期间结束的最后日期或时间。
此函数返回一个32位int数据类型的差异,可以存储最大值为2,147,483,647的值。
语法
SQL DATEDIFF() 函数的语法如下:
DATEDIFF(datepart, date1, date2)
参数
此函数接受三个参数。具体描述如下:
- datepart - 这指定要返回的日期或时间段的类型。以下是可能的取值:
- year, yyyy, yy = 年
- quarter, qq, q = 季度
- month, mm, m = 月份
- dayofyear, dy, y = 一年的第几天
- day, dd, d = 日
- week, ww, wk = 周
- weekday, dw, w = 工作日
- hour, hh = 小时
- minute, mi, n = 分钟
- second, ss, s = 秒
- millisecond, ms = 毫秒
- date1, date2 - 这些参数指定我们要比较的两个日期。
示例
我们可以使用以下查询计算两个日期值之间的差异:
YEAR
SQL> SELECT DATEDIFF(YEAR, '2023/03/15', '2033/02/15') AS DATE_DIFF_IN_YEARS;
输出
当我们执行上述查询时,输出结果如下:
+--------------------+
| DATE_DIFF_IN_YEARS |
+--------------------+
| 10 |
+--------------------+
示例
在这里,我们使用以下查询计算两个日期值之间的差值 以季度为单位 。
SQL> SELECT DATEDIFF(QUARTER, '2023/03/15', '2024/02/15') AS DATE_DIFF_IN_QUARTER;
输出
执行上述查询后,输出如下显示:
+----------------------+
| DATE_DIFF_IN_QUARTER |
+----------------------+
| 4 |
+----------------------+
示例
在以下示例中,我们试图计算两个指定时间之间的差异,以小时为单位。
SQL> SELECT DATEDIFF(HOUR, '2023/03/15 07:30:00:000', '2023/03/16 06:00:00:000') AS TIME_DIFF_IN_HOUR;
输出
上述查询的输出如下所示 –
+-------------------+
| TIME_DIFF_IN_HOUR |
+-------------------+
| 23 |
+-------------------+
示例
这里,我们使用以下查询计算两个指定时间之间的分钟差值 –
SQL> SELECT DATEDIFF(MINUTE, '2023/03/01 07:30', '2023/04/01 07:30') AS TIME_DIFF_IN_MINUTE;
输出
如果我们执行上述查询,结果如下所示:
+---------------------+
| TIME_DIFF_IN_MINUTE |
+---------------------+
| 44640 |
+---------------------+
示例
假设我们使用CREATE语句在SQL数据库中创建了一个名为EMPLOYEE的表,如下面的查询所示−
SQL> CREATE TABLE EMPLOYEE(ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, DATE_OF_BIRTH VARCHAR (20));
现在,我们将使用插入语句在EMPLOYEE表中插入一些记录,如下所示的查询语句 –
SQL> INSERT INTO EMPLOYEE(ID, NAME, DATE_OF_BIRTH) VALUES(1, 'Dhruv', '2000-12-05');
INSERT INTO EMPLOYEE(ID, NAME, DATE_OF_BIRTH) VALUES(2, 'Arjun', '2000-03-01');
INSERT INTO EMPLOYEE(ID, NAME, DATE_OF_BIRTH) VALUES(3, 'Dev', '2001-03-15');
INSERT INTO EMPLOYEE(ID, NAME, DATE_OF_BIRTH) VALUES(4, 'Riya', '2003-12-05');
INSERT INTO EMPLOYEE(ID, NAME, DATE_OF_BIRTH) VALUES(5, 'Aarohi', '2000-05-02');
INSERT INTO EMPLOYEE(ID, NAME, DATE_OF_BIRTH) VALUES(6, 'Lisa', '1999-11-25');
INSERT INTO EMPLOYEE(ID, NAME, DATE_OF_BIRTH) VALUES(7, 'Roy', '2001-05-30');
我们可以使用以下查询验证表是否已创建:
SQL> SELECT * FROM EMPLOYEE;
在SQL数据库中成功创建了EMPLOYEE表。
+-----+--------+---------------+
| ID | NAME | DATE_OF_BIRTH |
+-----+--------+---------------+
| 1 | Dhruv | 2000-12-05 |
| 2 | Arjun | 2000-03-01 |
| 3 | Dev | 2001-03-15 |
| 4 | Riya | 2003-12-05 |
| 5 | Aarohi | 2000-05-02 |
| 6 | Lisa | 1999-11-25 |
| 7 | Roy | 2001-05-30 |
+-----+--------+---------------+
在这里,我们使用以下查询计算每个员工的年龄(以年为单位)−
注意 − CURRENT_TIMESTAMP 检索当前的日期和时间。
SQL> SELECT ID, NAME, DATE_OF_BIRTH, DATEDIFF(YEAR, DATE_OF_BIRTH, CURRENT_TIMESTAMP) AS AGE_IN_YEARS FROM EMPLOYEE;
输出
当我们执行上述查询时,输出结果如下:
+-----+--------+---------------+--------------+
| ID | NAME | DATE_OF_BIRTH | AGE_IN_YEARS |
+-----+--------+---------------+--------------+
| 1 | Dhruv | 2000-12-05 | 23 |
| 2 | Arjun | 2000-03-01 | 23 |
| 3 | Dev | 2001-03-15 | 22 |
| 4 | Riya | 2003-12-05 | 20 |
| 5 | Aarohi | 2000-05-02 | 23 |
| 6 | Lisa | 1999-11-25 | 24 |
| 7 | Roy | 2001-05-30 | 22 |
+-----+--------+---------------+--------------+
示例
让我们使用CREATE语句在SQL数据库中创建名为OTT的另一个表,如下所示的查询:
SQL> CREATE TABLE OTT(ID INT NOT NULL, SUBSCRIBER_NAME VARCHAR (200) NOT NULL, MEMBERSHIP VARCHAR (200), SUBCRIPTION_DATE DATE NOT NULL);
现在,让我们使用以下的INSERT语句向OTT表中插入一些记录:
SQL> INSERT INTO OTT(ID, SUBSCRIBER_NAME, MEMBERSHIP, SUBCRIPTION_DATE) VALUES(1, 'Dhruv', 'Silver', '2022-12-05');
INSERT INTO OTT(ID, SUBSCRIBER_NAME, MEMBERSHIP, SUBCRIPTION_DATE) VALUES(2, 'Arjun','Platinum', '2021-03-01');
INSERT INTO OTT(ID, SUBSCRIBER_NAME, MEMBERSHIP, SUBCRIPTION_DATE) VALUES(3, 'Dev','Silver', '2021-03-15');
INSERT INTO OTT(ID, SUBSCRIBER_NAME, MEMBERSHIP, SUBCRIPTION_DATE) VALUES(4, 'Riya','Gold', '2022-12-05');
INSERT INTO OTT(ID, SUBSCRIBER_NAME, MEMBERSHIP, SUBCRIPTION_DATE) VALUES(5, 'Aarohi','Platinum', '2020-05-02');
INSERT INTO OTT(ID, SUBSCRIBER_NAME, MEMBERSHIP, SUBCRIPTION_DATE) VALUES(6, 'Lisa','Platinum', '2022-11-25');
INSERT INTO OTT(ID, SUBSCRIBER_NAME, MEMBERSHIP, SUBCRIPTION_DATE) VALUES(7, 'Roy','Gold', '2021-05-30');
我们可以使用以下查询来验证表OTT是否已创建−
SQL> SELECT * FROM OTT;
在SQL数据库中,表OTT已成功创建。
+-----+-----------------+------------+------------------+
| ID | SUBSCRIBER_NAME | MEMBERSHIP | SUBSCRIPTION_DATE|
+-----+-----------------+------------+------------------+
| 1 | Dhruv | Silver | 2022-12-05 |
| 2 | Arjun | Platinum | 2021-03-01 |
| 3 | Dev | Silver | 2021-03-15 |
| 4 | Riya | Gold | 2022-12-05 |
| 5 | Aarohi | Platinum | 2020-05-02 |
| 6 | Lisa | Platinum | 2022-11-25 |
| 7 | Roy | Gold | 2021-05-30 |
+-----+-----------------+------------+------------------+
在这里,我们尝试使用以下查询来显示订阅计划完成的剩余天数−
SQL> SELECT SUBSCRIBER_NAME, SUBCRIPTION_DATE, DATEDIFF(DAY, SUBCRIPTION_DATE, CURRENT_TIMESTAMP) AS REMAINING_DAYS FROM OTT;
输出
如果我们执行上面的查询,结果如下所示:
+-----------------+-------------------+-----------------+
| SUBSCRIBER_NAME | SUBSCRIPTION_DATE | REMAINING_DAYS |
+-----------------+-------------------+-----------------+
| Dhruv | 2022-12-05 | 72 |
| Arjun | 2021-03-01 | 716 |
| Dev | 2021-03-15 | 702 |
| Riya | 2022-12-05 | 72 |
| Aarohi | 2020-05-02 | 1019 |
| Lisa | 2022-11-25 | 82 |
| Roy | 2021-05-30 | 626 |
+-----------------+-------------------+-----------------+