Sql 获得少于1天的日期

Sql 获得少于1天的日期,sql,sql-server,date,sum,where-clause,Sql,Sql Server,Date,Sum,Where Clause,我想知道9月19日的数据 当输入20天的值时,我不知道如何表达变量的表达式以获得前一天的值。 @TransDate-1使用日期添加: : 在您的查询中: SELECT ItemCode, SUM(Quantity) FROM INVENTORYOUTDETAIL WHERE TransDate <= DATEADD(day, -1, @TransDate) AND FacilityCode = '10' AND OutType='MOVE' GROUP BY

我想知道9月19日的数据

当输入20天的值时,我不知道如何表达变量的表达式以获得前一天的值。 @TransDate-1使用日期添加:

:

在您的查询中:

SELECT ItemCode, SUM(Quantity)
FROM INVENTORYOUTDETAIL
WHERE 
    TransDate <= DATEADD(day, -1, @TransDate) 
    AND FacilityCode = '10' 
    AND OutType='MOVE' 
GROUP BY ItemCode
注意:您应该将变量@TransDate声明为日期而不是VARCHAR,然后:

如果列TransDate的日期类似于datatye,则可以直接将其与变量进行比较


如果列TransDate是VARCHAR,最安全的方法是在比较之前先将其转换为日期,因此:CONVERTdate,TransDate@TransDate可能应该是DATE或datetime,而不是varchar10。如果无法更改,您可能需要将TransDate转换为@TransDate。TransDate列是否也是一个varchar,它是否只存储日期,而不存储时间组件?如果TransDate列也是一个varchar,SQL Server是否会隐式转换为datetime,从而进行datetime比较?或者它会将变量@TransDate隐式转换为varchar和字符串比较?@DaleBurrell:好的观点。。。这似乎在中起作用,但不确定这个简单的测试是否足以证实这一点。@DaleBurrell:我编辑了我的答案,并对变量和列的数据类型进行了一些思考。OP注意:这说明了为什么在设计数据库时使用正确的数据类型很重要。必须将TransDate列转换为日期数据类型将导致性能下降,因为无法在该列上使用任何索引。
DATEADD(day, -1, @TransDate)
DECLARE @TransDate DATE
SET @TransDate = '2019-09-20'
SELECT DATEADD(day, -1, @TransDate)
| (No column name) | | :------------------ | | 19/09/2019 00:00:00 |
SELECT ItemCode, SUM(Quantity)
FROM INVENTORYOUTDETAIL
WHERE 
    TransDate <= DATEADD(day, -1, @TransDate) 
    AND FacilityCode = '10' 
    AND OutType='MOVE' 
GROUP BY ItemCode