SQL 年(GETDATE())

SQL YEAR(GETDATE())

我目前正在处理 returns 日期范围内记录的查询。理想的开始日期是从 2015 年开始。理论上,下面三个 SET 语句中的每一个都不应该将变量设置为 2015* 吗?

DECLARE @startDate datetime;
SET @startDate = '20150101';
SET @startDate = YEAR(GETDATE());
SET @startDate = DATEPART(yyyy,GETDATE());

只有第一个硬编码日期的行为符合预期。正在查询的另外两个 return ALL 记录。我在这里遗漏了什么吗?

*编辑:对于我最初对此的不清楚程度,我深表歉意。基本上,@startDate 应该设置为 01-01-XXXX,其中 XXXX 是今天日期所属的任何年份。它正在与另一个 DATETIME 变量进行比较。我希望这能澄清事情。

我认为这可行(对于 SQL-服务器):

SET @startDate = cast(YEAR(GETDATE()) as varchar(4))
SET @startDate = cast(DATEPART(yyyy,GETDATE()) as varchar(4))

这会告诉你发生了什么:

DECLARE @startDate datetime
SET @startDate = '20150101'
select @startdate
SET @startDate = YEAR(GETDATE()) 
select @startdate
SET @startDate = cast(YEAR(GETDATE()) as varchar(4))
select @startdate
SET @startDate = DATEPART(yyyy,GETDATE()) 
select @startdate
SET @startDate = cast(DATEPART(yyyy,GETDATE()) as varchar(4))
select @startdate

YEAR(GETDATE())DATEPART(yyyy,GETDATE()); 将 return 只是日期的年份部分 ,所以如果你今天 运行 他们你会得到 2015,而不是你想要的 date 2015-01-01

如果您想将日期值强制设置为当年的开始,一种方法是:

SET @startDate = YEAR(GETDATE()) + '-01-01';

您问题的答案是 "No"。变量 @StartDate 是日期时间。这没有意义:

set @startDate = 2015

没有意义。看起来像年份的整数不是日期。

如果你想要一年的第一天,你可以这样做:

set @startDate = dateadd(day,
                         1 - datepart(dayofyear, getdate()),
                         cast(getdate() as date)
                         ) as FirstDayOfYear