如何获得当年的第一个和最后一个日期?


110

使用SQL Server 2000,如何获得本年度的第一个和最后一个日期?

预期产量:

01/01/201231/12/2012

Answers:


237
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

13

这是一种相当简单的方法;

SELECT DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS 'First Day of Current Year';
SELECT DATEFROMPARTS(YEAR(GETDATE()), 12, 31) AS 'End of Current Year';

它不是性感的,但是很有效。


1
仅从Sql Server 2012开始可用。–
Lukas

12

您可以使用DATEPART函数从当前日期获得当前年份,使用getUTCDate()

SELECT 
    '01/01/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate())), 
    '31/12/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate()))

1
这将输出字符串,而不是日期。是的,如果确实需要,但是如果可以使用,则将日期保留为日期,不要将其用作字符串。
Jamie F

2
我不同意,OP没有指定,并且在sql server中设置的formet数据可能会返回类似“ 2012-01-01 12:13:14”而不是“ 01/01/2012”的结果
RandyMorris

1
@RandyMorris,同意,OP正在询问他是否可以DATETIME代替字符串来获取,显然根据该问题可能与预期输出不匹配。
维克多2012年

1
为什么要使用不明确的日期格式(答案中的字符串与注释中的格式不匹配)?yyyyMMdd是明确的。
Damien_The_Unbeliever 2012年

1
@Damien_The_Unbeliever,响应中的查询将根据问题匹配预期的输出。关于DATETIME的评论是对OP关于获取日期而不是字符串的评论的回应。答案并不反映此讨论。
维克多

7

只需写:-

select convert (date,DATEADD(YEAR,DATEDIFF(YEAR,0,GETDATE()),0))

一年的开始日期。

select convert (date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 1, -1))  

4

每年第一天为第一天,最后一天为31天,您只需要将年份附加到该日和月份即可,例如:

 SELECT '01/01/'+cast(year(getdate()) as varchar(4)) as [First Day],
 '12/31/'+cast(year(getdate()) as varchar(4)) as [Last Day]

1
这不一定是正确的,因为程序员对时间有很多误解
krillgar '18

谁能举例说明什么时候行不通?
slayernoah

@slayernoah根据服务器的本地化设置,我认为有时会产生错误。
Jamie F

3

要获取一年中的第一天和最后一天,可以使用该CONCAT功能。结果值可以转换为任何类型。

CONCAT(YEAR(Getdate()),'-01-01') FirstOfYear,
CONCAT(YEAR(GETDATE()),'-12-31') LastOfYear

年不适用于我,但date_part可以使用start_year_date:= CONCAT(date_part('Y',start_date_p):: int :: text,'-01-01'):: date;
博马特'18

1

对于当年的开始日期:

SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())

对于当年的结束日期:

SELECT DATEADD(DD,-1,DATEADD(YY,DATEDIFF(YY,0,GETDATE())+1,0))

1

另一种方法:(自SQL Server 2012起)

SELECT
    DATEFROMPARTS(YEAR(GETDATE()), 1, 1) FirstDay,
    DATEFROMPARTS(YEAR(GETDATE()),12,31) LastDay

0

看看这个:

select convert(varchar(12),(DateAdd(month,(Month(getdate())-1) * -1, DateAdd(Day,(Day(getdate())-1) * -1,getdate()))),103) as StartYear,
       convert(varchar(12),DateAdd(month,12 - Month(getdate()), DateAdd(Day,(31 - Day(getdate())),getdate())),103) as EndYear


0
print Cast('1/1/' + cast(datepart(yyyy, getdate()) as nvarchar(4)) as date)

您应该解释您的代码。代码转储通常被否决,并可能被删除。
错误

0

看起来您很感兴趣在给定年份内执行所有操作,如果确实如此,我建议使用YEAR()函数,如下所示:

SELECT * FROM `table` WHERE YEAR(date_column) = '2012';

这同样适用于DAY()MONTH() 。它们也可用于MySQL / MariaDB变体,并且是在SQL Server 2008中引入的(因此不适用于特定的2000)。


-1
select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31') 
from dual

这是针对PL-SQL的,帖子说SQL Server 2000,因此您必须使用T-SQL。To_Date和Sysdate在T-SQL中不存在
Andrew Failor,

-1

在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-获取当前时间戳的年份部分。

STRLTRIM-应用了这两个函数,以便我们可以将其转换为可以用所需前缀进行增补的varchar(在这种情况下,它可以是年份的第一个日期或年份的最后一个日期)。无论出于何种原因,YEAR函数生成的结果都有前缀空格。要修复它们,我们使用左侧修剪的LTRIM功能。


-1

如果到达1月1日,则可能是去年。

select
convert(date, DATEADD(yy, DATEDIFF(yy, 0,  DATEadd(day, -1,getdate())), 0), 103 ) AS StartOfYear,
convert(date, DATEADD(yy, DATEDIFF(yy, 0, DATEDIFF(day, -1,getdate()))+1, -1), 103 )AS EndOfYear

-2

试试这个:

DATE_FORMAT(NOW(),'01/01/%Y')
DATE_FORMAT(NOW(),'31/12/%Y')

Microsoft SQL Server。Msg 195, Level 15, State 10, Line 1 'NOW' is not a recognized function name.
jumxozizi

这个答案使用MySQL函数(并将日期强制转换为字符串,这是我的宠儿之一)。
阿尔瓦罗·冈萨雷斯

-3

--- 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.