我正试图弄清楚这一点,但它让我发疯了!如何在SQL中计算特定年份中两个日期之间的天数?例如:我们有范围日期[12/30/2016-01/05/2017]。如果我需要找出2017年这一系列日期之间的天数,那将是5天。SQL是如何做到这一点的?
您没有指定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)
您没有指定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
结果:
|DaysDiffValue||----------------:||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
结果:
|天结束日期年份||----------------:||69 |
db<gt;小提琴这里
这个问题的实际答案是"它取决于数据库供应商";因为即使是简单的日期计算也会有很大的变化,例如
MySQL
SELECT DATEDIFF('2017-01-05','2016-12-30');
TSQL(MS SQL Server(
SELECT DATEDIFF ( day,'2016-12-30', '2017-01-05')
Postgres
SELECT '2017-01-05'::DATE - '2016-12-30'::DATE
Firebird在Postgres中也有其他选择。
Oracle
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
您的请求需要操作日期,因此有必要了解哪个数据库。