【问题标题】:Fill Missing Dates between two dates in SQL Server填充 SQL Server 中两个日期之间的缺失日期
【发布时间】:2019-07-20 18:51:46
【问题描述】:

我有以下数据的临时表

我只想填写开始日期和结束日期之间缺失的日期,并重复运行余额列,直到未显示新余额。每个客户也需要相同的重复。当显示新余额时,它将再次重复下一个值。

另外,我想选择每天的最大交易日期。

有什么帮助吗?

DECLARE @Date DATETIME, @StartDate DATETIME, @EndDate DATETIME, @Counter INT, @TotalDays INT

SET @Date = '2018-11-25'

SET @StartDate = CONVERT(varchar, dateadd(month,datediff(month,0,@Date),0), 111)
SET @EndDate = CONVERT(varchar, dateadd(day,-1,dateadd(month,datediff(month,-1,@Date),0)), 111)
SET @Counter = 0
SET @TotalDays = DAY(@EndDate)
----------------------------------------------------------------

CREATE TABLE #Customers
(
    ID BIGINT IDENTITY(1,1),
    Customer_ID BIGINT,
    Transaction_Date DATETIME,
    Serial_No INT
)

INSERT INTO #Customers
(Customer_ID, Transaction_Date, Serial_No)

SELECT tc.Customer_Id, tc.Transaction_Date, tc.Serial_No

FROM Transaction_Main AS tm
JOIN Transaction_Detail AS td
    ON td.Transaction_Date = tm.Transaction_Date 
    AND td.Transaction_No = tm.Transaction_No
JOIN Transaction_Customer AS tc
    ON tc.Transaction_Date = td.Transaction_Date
    AND tc.Transaction_No = td.Transaction_No
    AND tc.Serial_No = td.Serial_No

WHERE tm.Transaction_Status IN ('A', 'P')
AND tm.Transaction_Date BETWEEN @StartDate  AND @EndDate + ' 23:59:59'
AND td.Transaction_Date BETWEEN @StartDate  AND @EndDate + ' 23:59:59'
AND tc.Transaction_Date BETWEEN @StartDate  AND @EndDate + ' 23:59:59'
AND tc.Customer_Id = 21
AND tm.Transaction_Type <> 4

【问题讨论】:

  • 能不能加一个你想要的输出的表结构?
  • 您可以添加您的选择查询吗?
  • “我想选择每天的最大交易日期”——你不能,因为你有几行具有相同的确切日期和时间。当天适用的金额是多少?我们无法为您猜测。

标签: sql sql-server tsql


【解决方案1】:

您可以使用full outer join 在下面的查询中使用Transaction_Date 进行选择查询(下面的示例带有日期过滤器):

create table #TempDate
(
    Customer_Id int,
    Transaction_Date datetime,
    Running_Balance varchar(50)
)

insert into #TempDate (Customer_Id, Transaction_Date, Running_Balance) values (21, '2018-11-01 13:20:37.923', '41,863.54')
insert into #TempDate (Customer_Id, Transaction_Date, Running_Balance) values (21, '2018-11-02 13:20:37.923', '16,863.54')
insert into #TempDate (Customer_Id, Transaction_Date, Running_Balance) values (21, '2018-11-23 13:20:37.923', '11,179.54')
insert into #TempDate (Customer_Id, Transaction_Date, Running_Balance) values (21, '2018-11-26 13:20:37.923', '11,164.54')
insert into #TempDate (Customer_Id, Transaction_Date, Running_Balance) values (21, '2018-11-28 13:20:37.923', '6,164.54')

DECLARE @STARTDATE nvarchar(100) = '11/01/2018'
DECLARE @ENDDATE nvarchar(100) = '11/28/2018 23:59:59'

SELECT a.Customer_Id, b.Transaction_Date, a.Running_Balance FROM 
(SELECT Customer_Id, CAST(Transaction_Date as DATE) AS Transaction_Date, 
Running_Balance from #TempDate 
WHERE Transaction_Date BETWEEN @STARTDATE AND @ENDDATE) a

FULL OUTER JOIN

(SELECT [Transaction_Date] = DATEADD(Day,Number,@STARTDATE) 
FROM  master..spt_values 
WHERE Type='P'
AND DATEADD(day,Number,@STARTDATE) <= @ENDDATE) b 
ON a.Transaction_Date = b.Transaction_Date ORDER BY b.Transaction_Date

【讨论】:

  • 感谢您的回复。我还需要重复运行余额列,直到未显示新值。 NULL 值不是必需的。
  • 你描述了一张桌子。然后你的查询有引用三个。我对您想要做什么以及必须使用哪些数据感到困惑。
猜你喜欢
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2019-05-19
相关资源
最近更新 更多