【问题标题】:Sql query to split the rows according to date range one day using sql query in Ms accessSql 查询以在一天使用 Ms 访问中的 sql 查询根据日期范围拆分行
【发布时间】:2021-03-28 21:12:07
【问题描述】:

例子

现有表

Id name col3  ... Startdate EndDate   days

1 ABC value... 01-jan-2020 03-Jan-2020 3

2 AB value... 01-feb-2020 10-feb-2020 5

3 AC value... 02-feb-2020 02-feb-2020 1

要求的结果

Id name col3 ... Startdate EndDate  days

1 ABC value ...01-jan-2020 01-jan-2020 1

1 ABC value ...02-jan-2020 02-jan-2020 1

1 ABC value ...03-jan-2020 03-jan-2020 1

2 AB value... 01-feb-2020 01-feb-2020 1

2 AB value... 02-feb-2020 02-feb-2020 1

2 AB value... 03-feb-2020 03-feb-2020 1

2 AB value... 04-feb-2020 04-feb-2020 1

2 AB value... 05-feb-2020 05-feb-2020 1

3 AC value... 02-feb-2020 02-feb-2020 1

我需要一个sql查询来保持所有列不变,并以一天为间隔更新日期, 拆分日期并在天列中放置一个。 如果我们只有一个,那么如果有更多的天数就没有变化,那么我们必须拆分日期并在天数列中放置一个,如上所示。

【问题讨论】:

标签: sql date ms-access days


【解决方案1】:

@June7 是对的。 VBA 是解决此问题的正确工具:

Public Function ExpandTable()

    Dim Records     As DAO.Recordset
    
    Dim ThisId      As Long
    Dim ThisName    As String
    Dim ThisCol3    As String
    Dim EndDate     As Date
    Dim NextDate    As Date
    
    Set Records = CurrentDb.OpenRecordset("Select * From TableTest Order By Id, StartDate")
    
    Records.MoveFirst
    While Not Records.EOF
        If ThisId <> Records!Id.Value Then
            ThisId = Records!Id.Value
            NextDate = Records!StartDate.Value
            EndDate = Records!EndDate.Value
            If NextDate < EndDate Then
                Records.Edit
                    Records!EndDate.Value = NextDate
                Records.Update
            End If
        End If
        While NextDate < EndDate
            ThisName = Records!Name.Value
            ThisCol3 = Records!Col3.Value
            NextDate = DateAdd("d", 1, NextDate)
            Records.AddNew
                Records!Id.Value = ThisId
                Records!Name.Value = ThisName
                Records!Col3.Value = ThisCol3
                Records!StartDate.Value = NextDate
                Records!EndDate.Value = NextDate
            Records.Update
        Wend
        Records.MoveNext
    Wend
    Records.Close
    
End Function

结果:

【讨论】:

  • 打开记录集时可以使用WHERE Days&lt;&gt;1 或WHERE StartDate&lt;&gt;EndDate 加快速度,因为您不需要处理某些记录。
  • 能否请您添加如何连接到访问和数据库,然后运行此查询
  • 如何做到这一点是数据库中的特定表
  • 发布的代码是 VBA 并将在 Access 中运行。只需将表名 TableTest 替换为您的实际表名即可。
【解决方案2】:

如果您有某种tally 表,则可以在 MS Access 中执行此操作。这是一个只包含数字的表格。您可以通过将行插入到只有一个标识列的表中来创建一个。

有了这样的表,你可以使用:

select id, name, . . . 
       dateadd("d", n.n - 1, startdate) as startdate,
       dateadd("d", n.n - 1, enddate) as enddate,
       1 as days
from t inner join
     tally as n
     on n.n <= t.days;

注意:MS Access 使得在查询中创建计数表变得非常困难。这在其他数据库中介于简单和微不足道之间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多