【问题标题】:can we use if condition for compare 2 dates and display the row in sql server我们可以使用 if 条件来比较 2 个日期并在 sql server 中显示该行吗
【发布时间】:2019-08-13 06:22:16
【问题描述】:

我有 2 个日期列,一个是当前日期,一个是用户定义日期,当用户定义日期比当前日期大 2 天时,我必须显示特定行。
在下面的代码中,当两个日期相等时,我尝试显示该行。但是我不知道如何在sql中显示该行。

我有以下专栏,

  • Rid
  • DateTime(用户定义日期和时间)
  • Reminder
  • Description
  • CRDateTime(当前日期和时间)

我必须设置 3 个条件。

  1. 如果两个日期相等意味着应该显示,
  2. 如果 DateTime 比 CRDate 早 2 天意味着我必须显示该行,
  3. 如果 DateTime 比 CRdate 早 1 天,则意味着我必须显示该行。
declare DateTime as datetime1;

select RId if CAST (DateTime as date) =CAST (@CRDateTime as date)

【问题讨论】:

  • 您使用的是哪个系统? MySQL、MSSQL 还是其他?
  • 您输入的内容无法编译。没有datetime1 类型并且SELECT 查询没有使用表。

标签: sql-server tsql


【解决方案1】:

IF...ELSE 语句是一个控制流语句,允许您根据指定条件执行或跳过语句块。

例如:

   IF Boolean_expression
   BEGIN
      -- Statement block executes when the Boolean expression is TRUE
   END
   ELSE
   BEGIN
      -- Statement block executes when the Boolean expression is FALSE
   END

如果您想检查 SQL 语句中的某些内容,您应该使用 where 子句。

它可能看起来像:

SELECT * FROM `[YOUR_TABLE_NAME]` WHERE `DateTime` = `CRDateTime`

如果您想检查 2 天十年内的日期,您可以使用 SQL DATEADD 函数。

看起来像:

SELECT DATEADD(day, +1, '2017/08/25') AS DateAdd;

此代码的结果是2017/08/26

在你的情况下,它看起来像这样:

SELECT RId where DATEADD(day, +2, DateTime) = CRDateTime

--- 编辑部分:---

编辑 1:

您可以在这里使用此代码:

SELECT RId WHERE 
`DateTime` = `CRDateTime` OR
DATEADD(day, +1, DateTime) = CRDateTime OR
DATEADD(day, +2, DateTime) = CRDateTime

【讨论】:

  • 此查询有效。但它没有显示值。它只显示列名。如何解决?
  • 先在这里试试这个SELECT * FROM [ENTER_HERE_YOUR_TABLE_NAME] WHERE `DateTime` = `CRDateTime` OR DATEADD(day, +1, DateTime) = CRDateTime OR DATEADD(day, +2, DateTime) = CRDateTime 在您的查询中您只选择RId。这可能就是原因。
【解决方案2】:

据我了解,您基本上希望显示 2 天范围内的所有记录。

 SELECT RId, DateTime, Reminder, Description, CRDateTime 
 WHERE CRDateTime BETWEEN DATETIME AND DATEADD(day, +2, DateTime)

或者你可以试试这个

 SELECT RId, DateTime, Reminder, Description, CRDateTime 
 WHERE DateTime BETWEEN DATEADD(day, -2, CRDateTime) AND CRDateTime 

【讨论】:

  • 此评论已执行。但它没有显示数据。它只显示列名?如何解决它
  • 在选择语句中添加您需要的列,更新请立即查看。
  • 实际上我添加了我需要的列。但我怀疑我没有得到存储在数据库中的数据。它只显示列名
  • @Gaayathri:试试这个,在第二部分更新了我的答案。
【解决方案3】:

问题不清楚。我假设实际的问题是如何在两个日期之间过滤表的行。

SQL 中的过滤(在任何产品中)是 WHERE 子句的工作,而不是 IF。您可以使用BETWEEN 子句选择范围内的值。

如果表字段和查询参数都是date变量,查询就简单了:

CREATE TABLE table1
(
    RId int PRIMARY KEY,
    DateField date,
    INDEX IX_Table1_Date (DateField)
)


declare @dateParam date='20190801';

SELECT RId
FROM table1
WHERE DateField BETWEEN dateadd(day,-2,@dateParam) AND @DateParam

此查询将利用IX_Table1_Date 索引来加快搜索速度。通常,对表字段应用任何类型的函数都会阻止查询引擎使用包含该字段的任何索引,因为索引中存储的值与函数的结果无关。

如果您使用日期参数作为当前日期,只需将GETDATE() 分配给它。

declare @dateParam date=GETDATE();

如果该字段不是日期,您可以将其强制转换为日期并仍然获得快速范围查询,因为查询引擎的速度足以将强制转换转换为范围查询。

SELECT RId
FROM table1
WHERE cast(DateField as date) BETWEEN dateadd(day,-2,@dateParam) AND @DateParam

如果DateField 不是与日期相关的类型,例如它是一个 varchar,a) 这是一个严重的错误,b) 服务器将无法使用任何索引。 p>

转换参数值不会影响性能,因为它们的实际值是在查询开始执行之前计算的。查询变得相当嘈杂:

declare @dateParam datetime='20190801'


SELECT RId
FROM table1
WHERE cast(DateField as date) 
       BETWEEN dateadd(day,-2,cast(@dateParam as date)) AND cast(@DateParam as date)

这就是为什么参数最好使用正确的类型

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多