首页 > 解决方案 > 日期集之间的 datediff

问题描述

出于某种原因,我正在为我在这里想要实现的逻辑而苦苦挣扎,并且想知道是否会有任何帮助。

在此处输入图像描述

请在下面找到数据的代码 -

/****** Object:  Table [dbo].[temp_TEST]    Script Date: 09/07/2021 12:01:26 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[temp_TEST](
    [TransactionId] [int] NULL,
    [DateFrom] [datetime] NULL,
    [DateTo] [datetime] NULL,
    [totalvalue] [decimal](18, 2) NULL,
    [DailyAmount] [decimal](18, 2) NULL,
    [EffectiveFromDate] [datetime] NULL,
    [EffectiveToDate] [datetime] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[temp_TEST] ([TransactionId], [DateFrom], [DateTo], [totalvalue], [DailyAmount], [EffectiveFromDate], [EffectiveToDate]) VALUES (809228, CAST(N'2021-06-14T00:00:00.000' AS DateTime), CAST(N'2021-06-27T00:00:00.000' AS DateTime), CAST(159.16 AS Decimal(18, 2)), CAST(11.37 AS Decimal(18, 2)), CAST(N'1946-01-01T00:00:00.000' AS DateTime), CAST(N'2021-06-22T00:00:00.000' AS DateTime))
INSERT [dbo].[temp_TEST] ([TransactionId], [DateFrom], [DateTo], [totalvalue], [DailyAmount], [EffectiveFromDate], [EffectiveToDate]) VALUES (809228, CAST(N'2021-06-14T00:00:00.000' AS DateTime), CAST(N'2021-06-27T00:00:00.000' AS DateTime), CAST(159.16 AS Decimal(18, 2)), CAST(11.37 AS Decimal(18, 2)), CAST(N'2021-06-23T00:00:00.000' AS DateTime), CAST(N'2021-07-09T11:59:40.833' AS DateTime))

我要做的是计算一组日期之间过去的天数。

所以这显示的是 DateFrom 和 DateTo 字段。这些是我想在 EffectiveFromDate 和 EffectiveToDate 之间计算的关键日期。

所以我期望的是 DateFrom 和 DateTo 之间过去的天数....在 EffectiveFromDate 和 EffectiveToDate 期间,所以每行过去了多少天,但仅在 DateFrom 和 DateTo 日期期间。

第一行 - 自 1946 年 1 月 1 日起生效,但于 21 年 6 月 22 日结束 - 即 DateFrom 和 DateTo 日期之间的 9 天。那是 14/06 到 22/06。

第二行 - 自 23/06 起生效。它仍然有效,因此有效日期是今天的日期......但自 23/06 以来一直是该值,因此 DateFrom 和 DateTo 之间将是 5 天。包括 23/06。

希望我已经正确解释了自己。

标签: tsql

解决方案


请检查下面,它应该有帮助。你需要使用ISNULLDATEDIFF功能

SELECT DATEDIFF(day, '2021/08/25', ISNULL('2021/08/28', getdate())) AS DateDiff;

SELECT DATEDIFF(day, '2021/08/25', ISNULL(null, GETDATE())) AS DateDiff;

SELECT DATEDIFF(day, EffectiveFromDate, ISNULL(EffectiveToDate, GETDATE())) AS DateDiff
FROM YourTable

根据有问题的新信息,请使用以下case when查询

SELECT DATEDIFF(day, 
case when EffectiveFromDate > DateFrom then EffectiveFromDate else DateFrom end, 
case when EffectiveToDate < DateTo then EffectiveToDate else DateTo end) AS DateDiff
FROM temp_TEST

它实际上给了你 8 天和 4 天,而不是 9 天和 5 天,但这就是这个功能的工作方式,你可以添加 +1 以包括第二个日期,见下文

SELECT DATEDIFF(day, 
case when EffectiveFromDate > DateFrom then EffectiveFromDate else DateFrom end, 
case when EffectiveToDate < DateTo then EffectiveToDate + 1 else DateTo + 1 end) AS DateDiff
FROM temp_TEST

推荐阅读