【问题标题】:Get date less 1 day获取日期少 1 天
【发布时间】:2019-09-22 23:10:21
【问题描述】:

我想知道 9 月 19 日的数据。

当输入20天的值时,不知道如何表达变量的表达式来得到前一天的值。 (@TransDate-1)

DECLARE @TransDate VARCHAR(10)
SET @TransDate = '2019-09-20'

SELECT ItemCode, SUM(Quantity)
FROM INVENTORYOUTDETAIL
WHERE TransDate <= @TransDate-1 AND FacilityCode = '10' AND OutType='MOVE' 
GROUP BY ItemCode

【问题讨论】:

  • @TransDate 可能应该是日期或日期时间,而不是 varchar(10)。如果无法更改,您可能需要 convert(date,@TransDate)。
  • TransDate 也是 varchar 吗?它是否只存储日期,从不存储时间组件?

标签: sql sql-server date sum where-clause


【解决方案1】:

使用DATEADD():

DATEADD(day, -1, @TransDate)

Demo on DB Fiddle

DECLARE @TransDate DATE
SET @TransDate = '2019-09-20'
SELECT DATEADD(day, -1, @TransDate)
| (无列名) | | :----------------- | | 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

注意:您应该将变量 @TransDate 声明为 DATE 而不是 VARCHAR,然后:

  • 如果列TransDate有类似DATE的数据类型,可以直接与变量比较

  • 如果列TransDateVARCHAR,最安全的方法是在比较之前先将其转换为DATE,所以:CONVERT(date, TransDate) &lt;= DATEADD(day, -1, @TransDate)

【讨论】:

  • 如果TransDate 列也是varchar,SQL Server 是否会隐式转换为日期时间并因此进行日期时间比较?或者它会将变量@TransDate 隐式转换为varchar 并进行字符串比较?
  • @DaleBurrell:好点...这似乎在this fiddle 中有效,但不确定这个简单的测试是否足以证实这一点。
  • @DaleBurrell:我编辑了我的答案,对变量和列的数据类型有一些想法。
  • OP 注释:这说明了为什么在设计数据库时使用正确的数据类型很重要。必须将 TransDate 列转换为 date 数据类型将导致性能下降,因为无法在该列上使用任何索引。
猜你喜欢
  • 2016-04-16
  • 2017-04-28
  • 2021-11-04
  • 2018-07-27
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多