Cha*_*nya 8 sql t-sql sql-server
我有一个T-SQL存储过程,我想搜索一个特定的值,并可选择将搜索限制在特定日期(如果它们被传入).如果为这些日期中的任何一个传递空值,那么我想忽略它们.我想通过将输入日期设置为最小值或最大值(如果它们为空)来实现此目的的方式.我不想硬编码最小值和最大值.所以我想知道什么是SQL相当于C#的DateTime.MaxValue和DateTime.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约束,协同工作以确保此表中只存在一行)
| 归档时间: |
|
| 查看次数: |
12722 次 |
| 最近记录: |