我目前正在处理一个从日期范围内返回记录的查询。理想的开始日期是2015年以后的所有内容。从理论上讲,下面三个SET语句中的每一个都不应该将变量设置为2015 *?
DECLARE @startDate datetime;
SET @startDate = '20150101';
SET @startDate = YEAR(GETDATE());
SET @startDate = DATEPART(yyyy,GETDATE());
只有第一个硬编码日期才符合预期。其他两个返回正在查询的所有记录。我在这里错过了什么吗?
*编辑:我为我最初的不清楚而道歉。基本上,@startDate
应设置为01-01-XXXX,其中XXXX是今天的任何一年的日期是其中的一部分。它与另一个DATETIME
变量进行比较。我希望澄清事情。
答案 0 :(得分:3)
你问题的答案是"否"。变量@StartDate
是日期时间。这没有意义:
set @startDate = 2015
没有意义。看起来像一年的整数不是日期。
如果你想要一年的第一天,你可以这样做:
set @startDate = dateadd(day,
1 - datepart(dayofyear, getdate()),
cast(getdate() as date)
) as FirstDayOfYear
答案 1 :(得分:2)
我认为这可行(对于SQL-Server):
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
答案 2 :(得分:0)
YEAR(GETDATE())
和DATEPART(yyyy,GETDATE());
将返回日期的年份,所以如果你今天运行它们,你会得到2015
,而不是<您似乎想要的是em> date 2015-01-01
。
如果要强制将日期值强制到当前年份的开头,则可以采用以下方法:
SET @startDate = YEAR(GETDATE()) + '-01-01';