Access 2010查询 - 生成两个日期之间每个月的结果

时间:2018-04-17 14:17:35

标签: sql ms-access

我工作的公司每月都会收到客户的回报。我有一个表格,其中包括客户信息和开始&返回的结束日期(tbl_allocationData),我想创建一个查询,返回每个客户应该返回的月份列表:

Client 1 ¦ 01/04/2018 ¦ 30/06/2018  
Client 2 ¦ 01/01/2019 ¦ 28/02/2019

会变成

Client 1 ¦ April 2018  
Client 1 ¦ May 2018  
Client 1 ¦ June 2018  
Client 2 ¦ January 2019  
Client 2 ¦ February 2019

任何建议都会非常感激 - 对于缺乏尝试的代码表示歉意,但我在Access的学习曲线上有一个陡峭的学习曲线,而且到目前为止我真的很难过。我已经看到类似的想法,民众使用单独的表格列出可能的日期(或在我的情况下几个月),但我没有能够成功地适应我的要求。感谢

2 个答案:

答案 0 :(得分:0)

您需要创建一个表作为月份查找,预先填充从给定的开始月份到未来某个月的每个月的开始日期(如果您愿意,可以在几年之后)。

在下面的示例中,表'mths'有一个日期列'dt'。

select a.client, b.dt as the_month 
   from tbl_allocationData a 
      inner join mths b on b.dt between a.start_month and a.end_month

结果:
'client1','2018-04-01 00:00:00'
'client1','2018-05-01 00:00:00'
'client1','2018-06-01 00:00:00'

对于日期格式,您可以应用您选择的日期格式化功能。

答案 1 :(得分:0)

一种方法:

有一个单独的表“Numbers”,它只包含一列(NumberToAdd)的连续数字(例如0,1,2,3,4,5,6,7,8,9 ....尽可能多的行因为你需要最大可能的月份范围,我会保留一个非常大的表格,其中有正数和负数,因为两者都很有用。)

创建一个新查询,该查询是Index表和employee表之间的笛卡尔连接。也就是说,两个表都是自己添加的,它们之间没有链接。

如果从Client Table中选择ClientID和Start Date列,并从Numbers表中选择NumberToAdd列,您将获得所有可能的组合 - 或者Numbers表中每行的每个客户端的行。现在,只需限制返回哪些NumberToAdd列 - 在NumberToAdd列上放置一个where子句,这样您只能获得小于客户端结束日期和开始日期之间不同月份数的NumberToAdd行。

您可以使用SQL语句中的dateadd函数来获取表示每个报告月份的日期(使用最终用户显示中的格式来获取您在问题中列出的特定日期表示形式)。

伪SQL:

SELECT 
     tbl_Clients.*, dateadd(m, tbl_Numbers.NumberToAdd, tbl_Clients.[Start Date]) AS MonthToReport 
FROM [Actual Name of Your Clients Table] AS tbl_Clients, 
     [Actual Name of Your Numbers Table] as tbl_Numbers 
WHERE 
     tbl_Numbers.NumberToAdd >= 0 AND dateadd(m, tbl_Numbers.NumberToAdd, tbl_Clients.[Start Date]) <= tbl_Clients.[End Date]

您将需要替换您的实际表名,如果您在日期字段中有时间戳,它可能会有点棘手。您可能还需要使用&lt; =符号进行一些调整,具体取决于您想要的结果。