SQL Convert(Date + Year(Date)) 在别人的代码中

标签 sql sql-server date sql-convert

我有一个 SQL View ,据我所知,它试图获取最新的发票日期以及该发票日期的年月组合。然后使用这些值来计算该月的数量。

我的 SQL 知识很基础,我不确定为什么这个人会做这部分:

MAX(CONVERT(varchar(3), InvoiceDate, 101) + CONVERT(varchar(4), 
                  YEAR(InvoiceDate))) AS YearMonth

其余的代码,包括 TOP(100) PERCENT 部分等,我相当满意。

我不确定所讨论的部分是否存在逻辑错误,或者它是否具有某些 SQL 或业务原因,因为在某些情况下它与最大发票日期完全不同。

完整的 SQL 表达式如下:

SELECT TOP (100) PERCENT    
            MAX(InvoiceDate) AS MaxInvoiceDate, 
            StockCode, Warehouse, 
            MAX(CONVERT(varchar(3), InvoiceDate, 101) + CONVERT(varchar(4), YEAR(InvoiceDate))) AS YearMonth
FROM dbo.ArTrnDetail
GROUP BY StockCode, Warehouse
HAVING (Warehouse = 'CS') OR
      (Warehouse = 'PS') OR
      (Warehouse = 'DS') OR
      (Warehouse = 'JS') OR
      (Warehouse = 'JN')
ORDER BY MaxInvoiceDate DESC

还有一个可能有问题的输出:

MaxInvoiceDate           | StockCode | Warehouse    | YearMonth
----------------------------------------------------------------
2013-08-21 00:00:00.000  | ACH045    | PS           | 12/2012

最佳答案

这很有趣,但也有道理。字符串“12”将成为任何月份公式中的 MAX 字符串,并且该记录转到前一年,如果实际最大值发生在 2013 年 8 月,这也有意义。修复它的最简单方法是移动MAX 在转换中,因此您要转换第一列中的相同日期:

SELECT TOP (100) PERCENT    
            MAX(InvoiceDate) AS MaxInvoiceDate, 
            StockCode, Warehouse, 
            CONVERT(varchar(3), MAX(InvoiceDate), 101) + CONVERT(varchar(4), YEAR(MAX(InvoiceDate))) AS YearMonth
FROM dbo.ArTrnDetail
GROUP BY StockCode, Warehouse
HAVING (Warehouse = 'CS') OR
      (Warehouse = 'PS') OR
      (Warehouse = 'DS') OR
      (Warehouse = 'JS') OR
      (Warehouse = 'JN')
ORDER BY MaxInvoiceDate DESC

至于原程序员为什么不在前半部分使用日期部分,它很巧妙,你通过获取 MM/DD/YYYY 的前 3 个字符免费获得 '/' 字符。这不是我想到的,但它实际上为您节省了命令或字符串连接。

关于SQL Convert(Date + Year(Date)) 在别人的代码中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39226856/

相关文章:

mysql - SQL 联盟 : Selecting id of file_up table

mysql - 如何返回两个列值之间的差异?

sql - cakephp 在执行前查看已编译的 SQL 查询

mysql - 简单的 SQL 格式

c# - EF Core 模型中导航属性的必要性

来自另一个表的日期的 MySQL 事件时间表

Java 在 HashMap 中查找最近的前一个日期

java - 从 java.sql.Timestamp 获取公历日期

sql - 唯一与非唯一聚集索引以加速非唯一字段上的搜索

sql - 当一个表有唯一的 FK 时,它是否应该有 PK?