SQL搜索值之间的日期,如果为NULL,则搜索Min/Max

Cha*_*nya 8 sql t-sql sql-server

我有一个T-SQL存储过程,我想搜索一个特定的值,并可选择将搜索限制在特定日期(如果它们被传入).如果为这些日期中的任何一个传递空值,那么我想忽略它们.我想通过将输入日期设置为最小值或最大值(如果它们为空)来实现此目的的方式.我不想硬编码最小值和最大值.所以我想知道什么是SQL相当于C#的DateTime.MaxValueDateTime.MinValue是.

我正在考虑像这样使用Coalesce

SELECT EmployeeName FROM Employee
WHERE  EmployeeID = @EmployeeId AND
Birthday BETWEEN Coalesce(@StartDate, <MinDateTime>) AND  
                 Coalesce(@EndDate, <MaxDateTime>)
Run Code Online (Sandbox Code Playgroud)

是否有内置函数/常量/变量/枚举我可以用于<MinDateTime><MaxDateTime>变量?

有什么建议?

Dam*_*ver 11

SQL Server中没有这样的功能.您可以轻松找到BOL(1753-01-01 - 9999-12-31)中允许的最短和最长日期.或者您可以轻松地对另一个日期进行硬编码(如果您真的正在使用生日,1800-01-01 - 2100-12-31可能就足够了).或者你可以(如果它是你展示的范围查询),让合并回到生日本身:

SELECT EmployeeName FROM Employee
WHERE  EmployeeID = @EmployeeId AND
Birthday BETWEEN Coalesce(@StartDate, Birthday) AND  
                 Coalesce(@EndDate, Birthday)
Run Code Online (Sandbox Code Playgroud)

但请注意,对于非常大的表,这不一定能很好地扩展.

接受后编辑,回应OP的评论

通常,对于SQL,如果您经常需要"引用"数据,则可以自己将其添加为表.(谷歌的"日历表"或"数字表sql").所以在这种情况下,如果你想,你可以添加一个"常量"(或者可能是"限制"表):

create table Constants (
    Lock char(1) not null,
    datetimeMin datetime not null,
    datetimeMax datetime not null,
    intMin int not null,
    intMax int not null,
    /* Other Min/Max columns, as required */
    constraint PK_Constants PRIMARY KEY (Lock),
    constraint CK_Constants_Locked CHECK (Lock='X')
)
insert into Constants (Lock,datetimeMin,datetimeMax,intMin,intMax)
select 'X','17530101','99991231',-2147483648,2147483647
Run Code Online (Sandbox Code Playgroud)

然后您可以在查询中引用(通过子选择,或通过交叉连接到此表).例如

SELECT EmployeeName
FROM Employee, Constants
WHERE  EmployeeID = @EmployeeId AND
Birthday BETWEEN Coalesce(@StartDate, Constants.datetimeMin) AND  
                 Coalesce(@EndDate, Constants.datetimeMax)
Run Code Online (Sandbox Code Playgroud)

(Lock,Primary Key和Check约束,协同工作以确保此表中只存在一行)