我想弄清楚這一點,但這讓我發瘋!如何在 SQL 中計算兩個日期之間特定年份的天數?例如:我們有范圍日期 [12/30/2016-01/05/2017]。如果我需要找出這個日期范圍之間的 2017 年有多少天,那就是 5 天。在 SQL 中是如何完成的?
uj5u.com熱心網友回復:
您沒有指定您的 DBMS,但如果您使用 PostgreSQL,您可以使用日期范圍來計算。
您的問題本質上是給定日期范圍與“2017”范圍之間的交集長度:
select daterange('2016-12-30', '2017-01-05', '[]') * daterange('2017-01-01', '2018-01-01')
默認情況下,上限在日期范圍中被排除在外,這就是為什么“2017”的范圍將 2018-01-01 指定為(排除的)上限的原因。*操作員計算這兩個范圍之間的交集。我假設您希望將2017-01-05 包含在要測驗的范圍內,這就是為什么它使用包容性上限 ( '[]') 創建的原因。
然后通過從上限中減去下限來計算長度:
select upper(result) - lower(result) as days
from (
select daterange('2016-12-30', '2017-01-05', '[]') * daterange('2017-01-01', '2018-01-01')
) t(result)
uj5u.com熱心網友回復:
您沒有指定您的 dbms,但籠統地說:
- 獲取@EndDate 年的第一天,即2017 年 1 月 1 日
- 然后計算@FirstOfYear 和@EndDate 之間的天數差
例如,在 MySQL 中,您可以使用MAKEDATE()來獲取今年的第一天。然后DATEDIFF()計算天數
SET @StartDate = '2016-12-30';
SET @EndDate = '2017-01-05';
SELECT DateDiff(@endDate, MAKEDATE(Year(@endDate),1)) 1 AS DaysInEndDateYear
結果:
| 天差值| | ----------------: | | 5 |
如果您還需要處理 @StartDate 和 @EndDate 都在同一年的范圍:
SET @StartDate = '2017-01-05';
SET @EndDate = '2017-03-14';
SELECT CASE WHEN Year(@StartDate) = Year(@EndDate) THEN DateDiff(@EndDate, @StartDate) 1
ELSE DateDiff(@endDate, MAKEDATE(Year(@endDate),1)) 1
END AS DaysInEndDateYear
結果:
| DaysInEndDateYear | | ----------------: | | 69 |
db<>在這里擺弄
uj5u.com熱心網友回復:
對此的實際答案是“這取決于資料庫供應商”,因為即使是簡單的日期計算也會有很大差異,例如
MySQL
SELECT DATEDIFF('2017-01-05','2016-12-30');
TSQL(MS SQL 服務器)
SELECT DATEDIFF ( day,'2016-12-30', '2017-01-05')
Postgres
SELECT '2017-01-05'::DATE - '2016-12-30'::DATE
Firebird 和 Postgres 也有替代方案。
甲骨文
SELECT (date '2017-01-05') - (date '2016-12-30') from dual
在 Oracle 中也有替代方案。
火鳥
select datediff(day,cast('2016-12-30' as date),cast('2017-01-05' as date)) from rdb$database
您的請求涉及操作日期的需要,因此有必要知道哪個資料庫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/447508.html
上一篇:上周日在VerticaSQL中?
下一篇:從日期陣列創建日期范圍
