【问题标题】:comparing dates is failing in SQL function在 SQL 函数中比较日期失败
【发布时间】:2019-03-12 16:06:16
【问题描述】:

我正在尝试使用标量函数配置计算列。我需要根据日期为列状态设置一个 BIT。

CREATE FUNCTION dbo.setStatus(@StartDate datetime, @EndDate datetime)
RETURNS bit
AS
BEGIN 
  RETURN (@StartDate < GETDATE() && GETDATE() < @EndDate)
END 
GO  

我在 ssms 中看到符号“

【问题讨论】:

  • 请注意getdate() 返回当前日期和时间。如果您只需要今天的日期,请使用convertcast 它来日期数据类型convert(date, getdate())
  • 强制性:标量值函数通常是性能问题的原因......
  • 嗯,SQL 语法与编程语言的不同之处之一是不能返回布尔表达式的结果。您可以使用布尔数据类型来测试某事是否为真(例如 where 子句和 case 表达式),但不返回布尔数据类型本身。此外,它的工作方式与您预期的略有不同,因为布尔值可以评估为真、假或未知(当涉及空值时,它不是简单的 1 0)。从本质上讲,您不能像预期的那样将 true/false 用于按位运算。
  • SQL Server does not have a boolean data type。 A bit 不是布尔值,而是它最亲近的亲戚(可以说)。

标签: sql-server tsql sql-function


【解决方案1】:

您需要使用CASE 语句来检查条件并相应地返回10

CREATE FUNCTION dbo.setStatus(@StartDate datetime, @EndDate datetime)
RETURNS bit
AS
BEGIN 
  RETURN (CASE WHEN @StartDate < GETDATE() AND GETDATE() < @EndDate THEN 1 ELSE 0 END)
END 
GO

编辑:SQL Server 的逻辑 AND 运算符是 AND 而不是 &amp;&amp;。我已经在查询中进行了更改

【讨论】:

  • ...当然,将&amp;&amp; 更改为AND (我看到你这样做了,但在你的解释中没有提到这一点。当然,正如米奇小麦在 cmets 中所写的那样答案 - 这很可能会成为性能杀手。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多