声明日期时间变量

时间:2018-03-16 11:44:46

标签: sql-server tsql sql-server-2014

我想知道我是否可以从数据库表中获取StartDate和EndDate,而不是分配StartDate和EndDate参数,如下所示?我已经在另一张桌子上有日期。我需要在这两个日期之间获取数据。

    DECLARE @StartDate datetime = '1/4/2015' 
    DECLARE @EndDate datetime = '5/20/2015'  

有可能这样做吗?

4 个答案:

答案 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)