129

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

预期输出:

01/01/201231/12/2012

4

19 回答 19

272
SELECT
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear

上面的查询给出了 12 月 31 日开始的午夜的日期时间值。这比一年中的最后一刻少了大约 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

其他时期

yy这种方法有两个很好的方面:良好的性能,并且可以通过将(=year) 的两次出现替换为不同的字符串来轻松更改其他时间段:

yy, yyyy    year
qq, q       quarter
mm, m       month
wk, ww      week 

(注意几周:开始日期取决于服务器设置。)

技术细节

这可以通过计算自 1900 年以来的年数,然后将其添加到零日期 = 1900 年 1 月 1 日。这可以通过替换部分或通过将函数替换为任意年份DATEDIFF(yy, 0, GETDATE())来更改为适用于任意日期“年份 - 1900 年。”GETDATE()DATEDIFF(...)

 SELECT
   DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
   DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015
于 2012-11-18T04:08:19.137 回答
38

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

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

这并不性感,但它有效。

于 2018-10-19T20:50:24.557 回答
12

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

SELECT 
    '01/01/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate())), 
    '31/12/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate()))
于 2012-11-18T04:07:06.117 回答
7

只需写:-

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

年的开始日期。

select convert (date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 1, -1))  
于 2014-11-11T10:19:25.537 回答
4

Every year has the 1 st as First date and 31 as the last date what you have to do is only attach the year to that day and month for example:-

 SELECT '01/01/'+cast(year(getdate()) as varchar(4)) as [First Day],
 '12/31/'+cast(year(getdate()) as varchar(4)) as [Last Day]
于 2012-11-18T09:22:32.467 回答
3

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

CONCAT(YEAR(Getdate()),'-01-01') FirstOfYear,
CONCAT(YEAR(GETDATE()),'-12-31') LastOfYear
于 2018-05-11T14:15:02.333 回答
3

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

SELECT
    DATEFROMPARTS(YEAR(GETDATE()), 1, 1) FirstDay,
    DATEFROMPARTS(YEAR(GETDATE()),12,31) LastDay
于 2018-06-12T09:38:08.683 回答
1

对于当年的开始日期:

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

对于当年的结束日期:

SELECT DATEADD(DD,-1,DATEADD(YY,DATEDIFF(YY,0,GETDATE())+1,0))
于 2017-02-13T14:47:52.853 回答
1

最好的方法是提取当前年份,然后像这样使用连接:

SELECT CONCAT(year(now()), '-01-01') as start, -- fist day of current year
       CONCAT(year(now()), '-31-12') as end;   -- last day of current year

这给了你: start : 2020-01-01 and end : 2020-31-12 日期格式。

于 2020-09-21T08:16:15.223 回答
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
于 2012-11-18T09:03:31.263 回答
0
print Cast('1/1/' + cast(datepart(yyyy, getdate()) as nvarchar(4)) as date)
于 2017-06-01T20:11:56.217 回答
0

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

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

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

于 2018-04-11T12:38:42.983 回答
0
SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())
于 2017-02-13T13:42:12.267 回答
0

获得一年中的第一个日期和最后一个日期的最佳方法是

SELECT CAST(CAST(YEAR(DATEADD(YEAR,-1,GETDATE())) AS VARCHAR) + '-' + '01' + '-' + '01' AS DATE) FIRST_DATE
SELECT CAST(CAST(YEAR(DATEADD(YEAR,-1,GETDATE())) AS VARCHAR) + '-' + '12' + '-' + '31' AS DATE) LAST_DATE
于 2021-02-24T07:52:55.300 回答
-1
select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31') 
from dual
于 2014-08-25T20:24:07.303 回答
-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功能。

于 2018-04-29T11:10:18.853 回答
-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
于 2018-12-20T15:58:15.923 回答
-2

尝试这个:

DATE_FORMAT(NOW(),'01/01/%Y')
DATE_FORMAT(NOW(),'31/12/%Y')
于 2016-01-12T10:23:27.343 回答
-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
于 2013-10-08T09:44:19.833 回答