sql - 需要计算截止日期的年月日

标签 sql sql-server sql-server-2008 date

我有一个名为日期的表,

Opendate    |   Closedate   
------------+---------------
2015-07-09  |   2016-08-10  

我期待这样的输出

opendate    |   closedate   |   diff    
------------+---------------+----------------------
2015-07-09  |   2016-08-10  |   1year 1month 1day   
2015-07-09  |   2016-03-01  |   8 months 20 days
2015-07-09  |   2015-07-11  |   2 days

但是当我运行这个查询时:

SELECT opendate, 
       closedate, 
       Datediff(year, opendate, closedate)  AS years, 
       Datediff(month, opendate, closedate) AS months, 
       Datediff(day, opendate, closedate)   AS days 
FROM   dates 

它给我这样的输出,

opendate    |   closedate   | years | months |  days    
------------+---------------+-------+--------+---------
2015-07-09  |   2016-08-10  |   1   |   13   |  397 

如何计算1年1月1日

最佳答案

您可以使用 Stacked CTE 逐一查找下一年、下一个月和下一个日期。

解释

下面的查询首先找出 opendate 和 closedate 的 DATEDIFF 年,并检查结果日期是否大于 closedate。如果是,则实际年份差为 Y -1 的 DATEDIFF。使用这个新日期并使用相同的逻辑获取月份的 DATEDIFF,然后获取天数的差异。

Online Example

查询

WITH D(Opendate,Closedate)AS
(
SELECT CAST('2015-07-09' AS DATE),CAST('2016-08-10' AS DATE)
UNION ALL 
SELECT CAST('2015-07-09' AS DATE),CAST('2016-03-01' AS DATE)
UNION ALL 
SELECT CAST('2015-07-09' AS DATE),CAST('2015-07-11' AS DATE)

),Y AS
(
SELECT Opendate,Closedate,
  CASE 
  WHEN DATEADD(YEAR,DATEDIFF(YEAR,Opendate,Closedate),Opendate) > Closedate 
  THEN DATEDIFF(YEAR,Opendate,Closedate) - 1 
  ELSE DATEDIFF(YEAR,Opendate,Closedate)
  END Years
FROM D
), YDate as 
(
SELECT Opendate,Closedate,Years,DATEADD(YEAR,Years,Opendate) as Newopendate
FROM Y
),M AS
(
SELECT Opendate,Closedate,Years,Newopendate,
CASE WHEN DATEADD(MONTH,DATEDIFF(MONTH,Newopendate,Closedate),Newopendate) > Closedate 
THEN DATEDIFF(MONTH,Newopendate,Closedate) - 1 
ELSE DATEDIFF(MONTH,Newopendate,Closedate) 
END Months
FROM YDate
) 
SELECT Opendate,Closedate,Years,Months,DATEDIFF(Day,DATEADD(MONTH,Months,Newopendate),Closedate) as days
FROM M

结果

Opendate    Closedate   Years   Months  days
09-07-2015 00:00    10-08-2016 00:00    1   1   1
09-07-2015 00:00    01-03-2016 00:00    0   7   21
09-07-2015 00:00    11-07-2015 00:00    0   0   2

关于sql - 需要计算截止日期的年月日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38277673/

相关文章:

mysql - 如何检查 mysql 数据库中的每第 N 个条目?

mysql between语句使用当前年份

mysql - 需要 MySQL 查询来提供更具可读性的结果

SQL MOVE记录到另一个表

sql - Oracle sql 从重复项中查找单行

sql-server - 使用带有两个表的 SQL View 在 MS-Access 表单上编辑数据的任何方法

sql-server - ColdFusion 8 执行 cfquery、事务和脏读

sql-server - 看不到 SQL Server 导入和导出向导中列出的数据库

sql-server - 如何在sql server中使用 "like"搜索数据

sql-server - SQL Server Management Studio 清除缓存代码完成