Answers:
SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
上面的查询提供了12月31日午夜的datetime值。这比一年中的最后时刻短了约24小时。如果要包括可能在12月31日发生的时间,则应与第二年的第一天进行<
比较。或者,您可以将其与当年的最后几毫秒进行比较,但是如果您使用的不是DATETIME(例如DATETIME2),则仍然存在差距:
SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS LastDayOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0) AS FirstOfNextYear,
DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0)) AS LastTimeOfYear
技术细节
通过计算自1900年以来的年数,DATEDIFF(yy, 0, GETDATE())
然后将其添加到零= 1900年1月1日,可以起作用。可以通过替换GETDATE()
部分或任意年份,将其更改为在任意日期工作,方法是将DATEDIFF(...)
函数替换为“ 1900年。”
SELECT
DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015
您可以使用DATEPART
函数从当前日期获得当前年份,使用getUTCDate()
SELECT
'01/01/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate())),
'31/12/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate()))
DATETIME
代替字符串来获取,显然根据该问题可能与预期输出不匹配。
yyyyMMdd
是明确的。
每年第一天为第一天,最后一天为31天,您只需要将年份附加到该日和月份即可,例如:
SELECT '01/01/'+cast(year(getdate()) as varchar(4)) as [First Day],
'12/31/'+cast(year(getdate()) as varchar(4)) as [Last Day]
另一种方法:(自SQL Server 2012起)
SELECT
DATEFROMPARTS(YEAR(GETDATE()), 1, 1) FirstDay,
DATEFROMPARTS(YEAR(GETDATE()),12,31) LastDay
print Cast('1/1/' + cast(datepart(yyyy, getdate()) as nvarchar(4)) as date)
select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31')
from dual
在Microsoft SQL Server(T-SQL)中,可以按照以下步骤进行操作
--beginning of year
select '01/01/' + LTRIM(STR(YEAR(CURRENT_TIMESTAMP)))
--end of year
select '12/31/' + LTRIM(STR(YEAR(CURRENT_TIMESTAMP)))
CURRENT_TIMESTAMP-返回执行查询时的SQL Server日期。
YEAR-获取当前时间戳的年份部分。
STR,LTRIM-应用了这两个函数,以便我们可以将其转换为可以用所需前缀进行增补的varchar(在这种情况下,它可以是年份的第一个日期或年份的最后一个日期)。无论出于何种原因,YEAR函数生成的结果都有前缀空格。要修复它们,我们使用左侧修剪的LTRIM功能。
--- Lalmuni演示-
create table Users
(
userid int,date_of_birth date
)
---插入值-
insert into Users values(4,'9/10/1991')
select DATEDIFF(year,date_of_birth, getdate()) - (CASE WHEN (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()),date_of_birth)) > getdate() THEN 1 ELSE 0 END) as Years,
MONTH(getdate() - (DATEADD(year, DATEDIFF(year, date_of_birth, getdate()), date_of_birth))) - 1 as Months,
DAY(getdate() - (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()), date_of_birth))) - 1 as Days,
from users