【问题标题】:(RIGHT(CONVERT part of varchar 103 to 120 DATETIME to display results as 120(RIGHT(CONVERT part of varchar 103 to 120 DATETIME 将结果显示为 120
【发布时间】:2016-09-23 01:13:09
【问题描述】:

我有以下查询,可以显示任何特定日期所需的所有正确结果。但是,我的客户希望能够一次搜索任何一个月,避免单独选择一个月中的每一天。我假设我能够转换日期的一部分(月+年),将其转换为另一种格式,然后使用它。当前显示为 05/2016 (103),但我需要能够搜索为 2016-05% (120) 才能显示结果。 代码将放置在 Access VBA 表单中。

SELECT 
    os.shop, os.prefix, 
    Rep_date AS FDate, 
    SUM(RC) AS Fulfilled, 
    SUM(RF) AS Refunded, 
    SUM(OS) AS TotalOS, 
    SUM(CA) AS TotalCA, 
    SUM(RET) AS TotalRET, 
    SUM(LOST) AS TotalLOST, 
    SUM(SHOR) AS TotalSHOR, 
    SUM(Total) AS Total, 
    CAST((CAST(SUM(RC) AS DECIMAL(9, 4)) / CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS RCPC, 
    CAST((CAST(SUM(RF) AS DECIMAL(9, 4)) / CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS RFPC, 
    CAST((CAST(SUM(OS) AS DECIMAL(9, 4)) / CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS OSPC, 
    CAST((CAST(SUM(CA) AS DECIMAL(9, 4)) / CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS CAPC, 
    CAST((CAST(SUM(RET) AS DECIMAL(9, 4)) / CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS RETPC, 
    CAST((CAST(SUM(LOST) AS DECIMAL(9, 4)) / CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS LOSTPC, 
    CAST((CAST(SUM(SHOR) AS DECIMAL(9, 4)) / CAST(SUM(Total) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS SHORPC, 
    SUM(Orders) AS TotalOrders, 
    SUM(AmazonShipped) AS AmazonShipped, 
    SUM(AmazonCancelled) AS AmazonCancelled, 
    SUM(AmazonUnshipped) AS AmazonUnshipped, 
    CAST((CAST(SUM(AmazonShipped) AS DECIMAL(9, 4)) / CAST(SUM(Orders) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS AmazonShippedPC, 
    CAST((CAST(SUM(AmazonCancelled) AS DECIMAL(9, 4)) / CAST(SUM(Orders) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS AmazonCancelledPC, 
    CAST((CAST(SUM(AmazonUnshipped) AS DECIMAL(9, 4)) / CAST(SUM(Orders) AS DECIMAL(9, 4))) AS DECIMAL(9, 4)) AS AmazonUnshippedPC, 
    p.Description 
FROM 
    OrderStatusSummary os 
LEFT JOIN 
    Prefix p ON os.prefix = p.prefix 
GROUP BY 
    Rep_date, os.shop, os.prefix, p.Description 
HAVING 
   (CAST(CONVERT(nvarchar(10), Rep_date, 120) AS DATETIME) = CONVERT(DATETIME, '25/05/2016', 103)) 
ORDER BY 
    CAST(CONVERT(nvarchar(10), Rep_date, 120) AS DATETIME) DESC

以上内容是按完整日期搜索的一种方式,以下是我尝试使用的仅按月/年搜索的内容,以向您展示我想要实现的目标。但是它不起作用。

HAVING (RIGHT(CONVERT(nvarchar(10), Rep_date, 103),7) = '05/2016') 

我更改的唯一部分代码是与顶部块相比的 HAVING。

【问题讨论】:

  • HAVING 子句用于聚合函数条件。也许您应该有一个派生表(或 cte)?
  • 很遗憾,我无法控制表格更改。
  • 派生表只是一个带有别名的子查询。
  • 派生表和 cte 是 SQL 结构,用于简化查询。
  • 如果Rep_datedate(time(2)) 数据类型,为什么不简单地使用where MONTH(Rep_date) = 5 AND YEAR(Rep_date) = 2016

标签: sql vba sql-server-2008 ms-access sql-server-2008-r2


【解决方案1】:

第 1 步 - 使用您的 vba 代码创建 2 个变量,分别命名为 startDate 和 endDate。将 startDate 设为相关年份月份的第一天,并将 endDate 设为下个月的第一天。

第 2 步 - 将这些变量用作具有此逻辑的 sql 的查询参数:

where rep_date >= startDate
and rep_date < endDate

【讨论】:

    【解决方案2】:

    几天后我带着新的头脑回到这个问题后,已经回答了我自己的问题..

    由于 Rep_date 是文本字段而不是日期字段,因此我不需要对其进行任何日期转换。

    HAVING LEFT(Rep_date, 7) = '2016-05' 
    

    工作得很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 2019-02-25
      • 2016-11-29
      相关资源
      最近更新 更多