如何使工作功能:DateAdd(getDate(),D,-2)//到期日期从今天起少于2天

时间:2019-05-25 08:13:35

标签: sql

我有此作业要解决:“选择从今天开始余额大于1000并且到期日期小于2天的行。”

我已经尝试过:

SELECT FROM Account
WHERE Balance > 1000
AND ExpirationDate < DateAdd(getDate(), D, -2);

create table Account (
ID int,
Owner char(40),
Balance float,
CreationDate datetime,
ExpirationDate datetime 
)


insert into Account (ID, Owner, Balance, CreationDate, ExpirationDate) values 
(1 , 'Frank Lampard', 2000, '2006-06-01', '2022-03-01'),
(2 , 'Mike Lincoln', 1500, '2007-05-15', '2022-10-01'),
(3 , 'Matt Fraser', 4000, '2011-12-11', '2021-003-01'),
(4 , 'John Mc Donald', 3000, '2012-05-02', '2023-01-01'),
(5 , 'Elena Svitolina', 2800, '2007-02-06', '2022-04-01'),
(6 , 'Naomy Osaka', 5000, '2008-02-21', '2022-03-01'),
(7 , 'Jean Valjean', 1500, '20011-07-11', '2021-04-01'),
(8 , 'Adrian Svenson', 4500, '2009-08-20', '2024-05-01'),
(9 , 'Johnny Cash', 4000, '2010-05-11', '2021-01-01'),
(10 , 'Dan Simons', 2000, '2011-07-22', '2022-10-01');

我希望输出显示为:

选择从今天起余额大于1000并且到期日期小于2天的行

输出为:

  

错误1:无法准备语句(“ FROM”附近的1:语法错误)

2 个答案:

答案 0 :(得分:0)

首先,要解决您遇到的错误,请注意您缺少选择列表。

其次,您以错误的顺序输入了DateAdd的参数:

SELECT *
-- Here^
FROM   Account
WHERE  Balance > 1000 AND ExpirationDate < DateAdd(d, -2, GetDate())

答案 1 :(得分:0)

由于getdate()具有时间成分,而示例数据没有,因此我将“从今天起不到2天”解释为没有时间成分的比较。我认为适当的逻辑是:

SELECT a.*
FROM Account a
WHERE a.Balance > 1000 AND
      a.ExpirationDate < DateAdd(day, -2, CONVERT(date, getDate()));

注意:

  • 这引入了表别名(a
  • 这将限定所有列名,这是一种最佳做法(并在SELECT中添加缺少的表达式)。
  • 这说明了日期部分(即使用day而不是d),也是一种最佳做法。

编辑:

上面的语法对于SQL Server来说很好,这似乎就是您想要的。但是,如果您不使用SQL Server,它将无法正常工作(可能)。标准语法为:

SELECT a.*
FROM Account a
WHERE a.Balance > 1000 AND
      a.ExpirationDate < CURRENT_DATE - INTERVAL '2 day';