我想知道我是否可以从数据库表中获取StartDate和EndDate,而不是分配StartDate和EndDate参数,如下所示?我已经在另一张桌子上有日期。我需要在这两个日期之间获取数据。
DECLARE @StartDate datetime = '1/4/2015'
DECLARE @EndDate datetime = '5/20/2015'
有可能这样做吗?
答案 0 :(得分:2)
如果您想从另一张表中获取日期,请使用
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SELECT @StartDate = NameOfStartDateColumn, @EndDate = NameOfEndDateColumn
FROM TableName
如评论中所述,如果TableName包含多于一行,您可以在上面添加WHERE子句以选择您所在的行。
答案 1 :(得分:1)
演示
请注意,您将获得最后读取的日期,并且没有自然顺序,因此您需要一个独特的排序才能获得良好的作业。
declare @dates table(iden int identity primary key, d1 datetime, d2 datetime)
insert into @dates values ('1/1/1910', '1/2/1910'), ('1/1/1915', '1/2/1915');
DECLARE @StartDate DATETIME = (select top (1) d.d1 from @dates d);
DECLARE @EndDate DATETIME;
SELECT @StartDate = d.d1, @EndDate = d.d2
FROM @dates d;
select @StartDate, @EndDate
SELECT top (1) @StartDate = d.d1, @EndDate = d.d2
FROM @dates d
order by d.iden;
select @StartDate, @EndDate
----------------------- -----------------------
1915-01-01 00:00:00.000 1915-01-02 00:00:00.000
----------------------- -----------------------
1910-01-01 00:00:00.000 1910-01-02 00:00:00.000
在声明行中,您需要使用()并仅返回1
答案 2 :(得分:0)
在SELECT
语句中将值分配给变量:
DECLARE @MyVar DATETIME;
SELECT @MyVar = MyDateTimeColumn FROM MyTable WHERE ...;
请注意,只有一个值将分配给变量,请确保您的select语句只返回一条记录以防止出现不可预测的结果!
您当然可以为变量分配一个聚合值,例如MIN / MAX / SUM / etc函数的结果:
SELECT @MyVar = MAX(MyDateTimeColumn) FROM MyTable;
在这种情况下,我强烈建议在没有返回结果的情况下提供默认值:
SELECT @MyVar = ISNULL(MAX(MyDateTimeColumn), '2200-01-01') FROM MyTable;
您可以在一个查询中为多个变量赋值,但必须将所有列分配给变量:
SELECT
@MyVarMin = ISNULL(MIN(MyDateTimeColumn), '1900-01-01')
, @MyVarMax = ISNULL(MAX(MyDateTimeColumn), '2200-01-01')
FROM
MyTable;
现在,要验证您是否拥有正确的值:
SELECT @MyVar;
您可以像往常一样在任何后续查询中使用您的变量。
您也可以将源表连接到参数表,实际的解决方案取决于您的数据模型以及您希望实现的目标。
答案 3 :(得分:0)
我的理解是,您有一个包含数据的表,其中包含一个类型为datetime
的列,另一个表包含所需的日期范围,例如:
CREATE TABLE [dbo].[Dates](
[StartDate] [datetime] NULL,
[EndDate] [datetime] NULL
) ON [PRIMARY]
现在您要从数据表中选择数据(我们称之为MyData
),该数据位于Dates
表中条目定义的范围内,对吗?
然后你可以做一个子选择
SELECT *
FROM [TEST].[dbo].[MyData]
WHERE Date between (SELECT BeginDate FROM dbo.dates) and (SELECT EndDate FROM dbo.dates)