回答:
SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
上記のクエリは、12月31日の初めの午前0時の日時値を示します。これは、今年の最後の瞬間から約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]
今年の開始日:
SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())
現在の年の終了日:
SELECT DATEADD(DD,-1,DATEADD(YY,DATEDIFF(YY,0,GETDATE())+1,0))
別の方法:(SQL Server 2012以降)
SELECT
DATEFROMPARTS(YEAR(GETDATE()), 1, 1) FirstDay,
DATEFROMPARTS(YEAR(GETDATE()),12,31) LastDay
これをチェックしてください:
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
SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())
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サーバーの日付を返します。
YEAR-現在のタイムスタンプの年の部分を取得します。
STR、LTRIM-これらの2つの関数は、目的の接頭辞(この場合は年の最初の日付または年の最後の日付)と連結できるvarcharに変換できるように適用されます。なんらかの理由で、YEAR関数によって生成された結果にはプレフィックススペースがあります。それらを修正するには、左トリムであるLTRIM関数を使用します。
これを試して:
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.
---ラルムニデモ---
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