【发布时间】:2012-11-06 09:42:34
【问题描述】:
使用 SQL Server 2000,如何获取当年的第一天和最后一天?
预期输出:
01/01/2012 和 31/12/2012
【问题讨论】:
标签: sql sql-server sql-server-2000
使用 SQL Server 2000,如何获取当年的第一天和最后一天?
预期输出:
01/01/2012 和 31/12/2012
【问题讨论】:
标签: sql sql-server sql-server-2000
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
(注意周数:开始日期取决于服务器设置。)
技术详情
这可以通过使用DATEDIFF(yy, 0, GETDATE()) 计算自 1900 年以来的年数,然后将其添加到零日期 = 1900 年 1 月 1 日。可以通过替换 GETDATE() 部分将其更改为适用于任意日期或任意年份,将DATEDIFF(...) 函数替换为“Year - 1900”。
SELECT
DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015
【讨论】:
获取一年中的第一个日期和最后一个日期的最佳方法是
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
【讨论】:
最好的方法是提取当前年份,然后像这样使用连接:
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 日期格式。
【讨论】:
如果它到了 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
【讨论】:
这是一个相当简单的方法;
SELECT DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS 'First Day of Current Year';
SELECT DATEFROMPARTS(YEAR(GETDATE()), 12, 31) AS 'End of Current Year';
这并不性感,但很有效。
【讨论】:
另一种方式:(自 SQL Server 2012 起)
SELECT
DATEFROMPARTS(YEAR(GETDATE()), 1, 1) FirstDay,
DATEFROMPARTS(YEAR(GETDATE()),12,31) LastDay
【讨论】:
要获取一年中的第一天和最后一天,可以使用CONCAT 函数。结果值可以转换为任何类型。
CONCAT(YEAR(Getdate()),'-01-01') FirstOfYear,
CONCAT(YEAR(GETDATE()),'-12-31') LastOfYear
【讨论】:
在 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 功能。
【讨论】:
print Cast('1/1/' + cast(datepart(yyyy, getdate()) as nvarchar(4)) as date)
【讨论】:
对于当年的开始日期:
SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())
对于当年的结束日期:
SELECT DATEADD(DD,-1,DATEADD(YY,DATEDIFF(YY,0,GETDATE())+1,0))
【讨论】:
试试这个:
DATE_FORMAT(NOW(),'01/01/%Y')
DATE_FORMAT(NOW(),'31/12/%Y')
【讨论】:
Msg 195, Level 15, State 10, Line 1 'NOW' is not a recognized function name.
SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())
【讨论】:
简单地写:-
select convert (date,DATEADD(YEAR,DATEDIFF(YEAR,0,GETDATE()),0))
一年的开始日期。
select convert (date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 1, -1))
【讨论】:
select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31')
from dual
【讨论】:
---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
【讨论】:
每年都有 1 st 作为第一个日期,31 作为最后一个日期,您只需将年份附加到该日期和月份,例如:-
SELECT '01/01/'+cast(year(getdate()) as varchar(4)) as [First Day],
'12/31/'+cast(year(getdate()) as varchar(4)) as [Last Day]
【讨论】:
看看这个:
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
【讨论】:
你可以使用DATEPART函数获取当前年份,从使用getUTCDate()获取的当前日期开始
SELECT
'01/01/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate())),
'31/12/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate()))
【讨论】:
DATETIME 而不是字符串,显然这可能与问题的预期输出不匹配。
yyyyMMdd 是明确的。