Access、DateSerial 函数导致结果不准确(用户输入 2 位月份数字)
Access, DateSerial function causing inaccurate results (user inputs 2 digit month number)
下面显示的查询 returns 本年度的月度结果。为了根据用户输入的月份数字创建一个只有 returns 一个月结果的新查询,我修改了涉及查询的 DateSerial 函数的最后 5 行代码。
问题是新查询的结果在几个月内略有不同。是什么导致两个查询之间的结果不匹配?除了最后 5 行的 DateSerial 函数外,代码没有更改。
新查询的最后5行代码
FROM (SELECT DateSerial(Year(Date()),[Enter 2 digit month number],1) AS month_start,
DateAdd("d", -1, DateSerial(Year(Date()),[Enter 2 digit month number],31)) AS month_end
FROM SALES_RECEIPT
WHERE sale_date between DateSerial(Year(Date()), [Enter 2 digit month number], 1) and DateSerial(Year(Date()),[Enter 2 digit month number]+1, 0)
GROUP BY Year(sale_date), Month(sale_date)) AS months;
查询当年returns个月的结果:
SELECT Format(DatePart("m",months.month_start),"00") & "/" & Year(months.month_start) AS [Month/Year],
(SELECT Round(Nz(Sum(sales_receipt.SELLING_PRICE*sales_receipt.quantity),0),2)
FROM SALES_RECEIPT
WHERE SALES_RECEIPT.SALE_DATE between months.month_start and months.month_end) AS [Gross Sales],
(SELECT Round(Nz(Sum((Nz(inventory.VENDOR_ACTUAL_PRICE,0))*sales_receipt.quantity),0),2)
FROM SALES_RECEIPT INNER JOIN INVENTORY ON INVENTORY.INVENTORY_ID = SALES_RECEIPT.INVENTORY_ID
WHERE SALES_RECEIPT.SALE_DATE between months.month_start and months.month_end ) AS COGS,
(SELECT Round(Nz(Sum(sales_receipt.SELLING_PRICE * sales_receipt.quantity),0) - Nz(Sum(inventory.VENDOR_ACTUAL_PRICE * sales_receipt.quantity),0),2)
FROM INVENTORY INNER JOIN SALES_RECEIPT ON INVENTORY.INVENTORY_ID = SALES_RECEIPT.INVENTORY_ID
WHERE SALES_RECEIPT.[SALE_DATE] between months.month_start and months.month_end) AS [Sales Margin],
(SELECT Round(Nz(Sum(sales_receipt.SELLING_PRICE * sales_receipt.quantity),0) ,2)
FROM SALES_RECEIPT
WHERE SALES_RECEIPT.SALE_DATE between months.month_start and months.month_end and SALES_RECEIPT.SALES_TAX_EXEMPT="No") AS [Taxable Sales],
(SELECT Round(Nz(Sum(sales_receipt.SELLING_PRICE * sales_receipt.quantity),0) ,2)
FROM SALES_RECEIPT
WHERE SALES_RECEIPT.SALE_DATE between months.month_start and months.month_end and SALES_RECEIPT.SALES_TAX_EXEMPT="Yes") AS [Tax Free Sales],
(SELECT Round(Nz(Sum(sales_receipt.SELLING_PRICE * sales_receipt.quantity),0) ,2) * .05
FROM SALES_RECEIPT
WHERE SALES_RECEIPT.SALE_DATE between months.month_start and months.month_end and SALES_RECEIPT.SALES_TAX_EXEMPT="No") AS [Total Sales Tax],
(Select Round(Nz(Sum(Shipping_CHARGES.Shipping_COST),0),2)
FROM SHIPPING_CHARGES
WHERE SHIPPING_CHARGES.ENTRY_DATE between months.month_start and months.month_end ) AS [Total Shipping Charges]
FROM (SELECT DateSerial(Year(sale_date), Month(sale_date), 1) AS month_start,
DateAdd("d", -1, DateSerial(Year(sale_date), Month(sale_date) + 1, 1)) AS month_end
FROM SALES_RECEIPT
WHERE sale_date between #1/1# And #12/31#
GROUP BY Year(sale_date), Month(sale_date)) AS months;
以下是 DateSerial 函数代码的更正版本,它将 return 获得准确的结果。
FROM (SELECT DateSerial(Year(date()), [Enter 2 digit month number], 1) AS month_start,
DateAdd("d", -1, DateSerial(Year(date()), [Enter 2 digit month number] + 1, 1)) AS month_end
FROM SALES_RECEIPT
WHERE sale_date between DateSerial(Year(Date()), [Enter 2 digit month number], 1) and DateSerial(Year(Date()), [Enter 2 digit month number]+1, 0)
GROUP BY Year(sale_date), Month(sale_date)) AS months;
下面显示的查询 returns 本年度的月度结果。为了根据用户输入的月份数字创建一个只有 returns 一个月结果的新查询,我修改了涉及查询的 DateSerial 函数的最后 5 行代码。
问题是新查询的结果在几个月内略有不同。是什么导致两个查询之间的结果不匹配?除了最后 5 行的 DateSerial 函数外,代码没有更改。
新查询的最后5行代码
FROM (SELECT DateSerial(Year(Date()),[Enter 2 digit month number],1) AS month_start,
DateAdd("d", -1, DateSerial(Year(Date()),[Enter 2 digit month number],31)) AS month_end
FROM SALES_RECEIPT
WHERE sale_date between DateSerial(Year(Date()), [Enter 2 digit month number], 1) and DateSerial(Year(Date()),[Enter 2 digit month number]+1, 0)
GROUP BY Year(sale_date), Month(sale_date)) AS months;
查询当年returns个月的结果:
SELECT Format(DatePart("m",months.month_start),"00") & "/" & Year(months.month_start) AS [Month/Year],
(SELECT Round(Nz(Sum(sales_receipt.SELLING_PRICE*sales_receipt.quantity),0),2)
FROM SALES_RECEIPT
WHERE SALES_RECEIPT.SALE_DATE between months.month_start and months.month_end) AS [Gross Sales],
(SELECT Round(Nz(Sum((Nz(inventory.VENDOR_ACTUAL_PRICE,0))*sales_receipt.quantity),0),2)
FROM SALES_RECEIPT INNER JOIN INVENTORY ON INVENTORY.INVENTORY_ID = SALES_RECEIPT.INVENTORY_ID
WHERE SALES_RECEIPT.SALE_DATE between months.month_start and months.month_end ) AS COGS,
(SELECT Round(Nz(Sum(sales_receipt.SELLING_PRICE * sales_receipt.quantity),0) - Nz(Sum(inventory.VENDOR_ACTUAL_PRICE * sales_receipt.quantity),0),2)
FROM INVENTORY INNER JOIN SALES_RECEIPT ON INVENTORY.INVENTORY_ID = SALES_RECEIPT.INVENTORY_ID
WHERE SALES_RECEIPT.[SALE_DATE] between months.month_start and months.month_end) AS [Sales Margin],
(SELECT Round(Nz(Sum(sales_receipt.SELLING_PRICE * sales_receipt.quantity),0) ,2)
FROM SALES_RECEIPT
WHERE SALES_RECEIPT.SALE_DATE between months.month_start and months.month_end and SALES_RECEIPT.SALES_TAX_EXEMPT="No") AS [Taxable Sales],
(SELECT Round(Nz(Sum(sales_receipt.SELLING_PRICE * sales_receipt.quantity),0) ,2)
FROM SALES_RECEIPT
WHERE SALES_RECEIPT.SALE_DATE between months.month_start and months.month_end and SALES_RECEIPT.SALES_TAX_EXEMPT="Yes") AS [Tax Free Sales],
(SELECT Round(Nz(Sum(sales_receipt.SELLING_PRICE * sales_receipt.quantity),0) ,2) * .05
FROM SALES_RECEIPT
WHERE SALES_RECEIPT.SALE_DATE between months.month_start and months.month_end and SALES_RECEIPT.SALES_TAX_EXEMPT="No") AS [Total Sales Tax],
(Select Round(Nz(Sum(Shipping_CHARGES.Shipping_COST),0),2)
FROM SHIPPING_CHARGES
WHERE SHIPPING_CHARGES.ENTRY_DATE between months.month_start and months.month_end ) AS [Total Shipping Charges]
FROM (SELECT DateSerial(Year(sale_date), Month(sale_date), 1) AS month_start,
DateAdd("d", -1, DateSerial(Year(sale_date), Month(sale_date) + 1, 1)) AS month_end
FROM SALES_RECEIPT
WHERE sale_date between #1/1# And #12/31#
GROUP BY Year(sale_date), Month(sale_date)) AS months;
以下是 DateSerial 函数代码的更正版本,它将 return 获得准确的结果。
FROM (SELECT DateSerial(Year(date()), [Enter 2 digit month number], 1) AS month_start,
DateAdd("d", -1, DateSerial(Year(date()), [Enter 2 digit month number] + 1, 1)) AS month_end
FROM SALES_RECEIPT
WHERE sale_date between DateSerial(Year(Date()), [Enter 2 digit month number], 1) and DateSerial(Year(Date()), [Enter 2 digit month number]+1, 0)
GROUP BY Year(sale_date), Month(sale_date)) AS months;