计算特定年份中两个日期之间的日期数



我正试图弄清楚这一点,但它让我发疯了!如何在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

您的请求需要操作日期,因此有必要了解哪个数据库。

相关内容

  • 没有找到相关文章

最新更新