【发布时间】:2020-08-31 14:09:34
【问题描述】:
我创建了一个 SQL 存储过程:
CREATE PROCEDURE [stored procedure name]
(
@Location [varchar](255),
@start_date datetime,
@end_date datetime
)
AS
BEGIN
SELECT id, location, name, begin_date, age, career, phone_number
FROM information
WHERE (begin_date = @start_date OR @start_date IS NULL)
AND (begin_date = @end_date OR @end_date IS NULL)
AND (location = @Location OR @Location = 'All')
END
我的想法是将@start_date和@end_date默认设置为Null,但如果用户选择这样做,它也可以显示一段时间内的特定数据,这意味着:
- 当我运行以下代码时:
EXEC [stored procedure name] @start_date = NULL, @end_date = NULL, @Location = 'New York';
它将显示来自纽约的所有数据,无论时间。
- 当我运行以下代码时:
EXEC [stored procedure name] @start_date = '2020-03-01', @end_date = '2020-03-31', @Location = 'New York';
它将显示 2020 年 3 月 1 日至 2020 年 3 月 31 日期间纽约的数据。
如何调整我的代码以实现这个目标?我的代码似乎缺少@start_date 和@end_date 之间的联系。
【问题讨论】:
-
由于您以
date格式传递日期变量,并且您的begin_date字段为datetime,因此在进行匹配之前可能值得转换为日期。即CONVERT(DATE,begin_date)>= @start_date -
尽管出于性能原因,最好不在
where子句中转换您的列。这就是考虑时间的范围检查更好的原因。
标签: sql sql-server tsql stored-procedures parameters