具体的には MSSQL 2005 です。
9 に答える
これが今月の最後の1秒を与える解決策です。日付部分を抽出するか、日だけを返すように変更することができます。これをSQLServer2005でテストしました。
select dateadd( s, -1, dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 ) );
それがどのように機能するかを理解するには、dateadd( )関数とdatediff()関数を調べる必要があります。
DATEADD(datepart, number, date)
DATEDIFF(datepart, startdate, enddate)
datediff()の最も内側の呼び出しを実行すると、タイムスタンプ0以降の現在の月の番号が取得されます。
select datediff(m, 0, getdate() );
1327
次の部分では、その月数に1を加えたものを0タイムスタンプに追加して、次の暦月の開始点を示します。
select dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 );
2010-09-01 00:00:00.000
最後に、外側のdateadd()は、翌月の開始タイムスタンプから1秒を差し引くだけで、現在の月の最後の1秒になります。
select dateadd( s, -1, dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 ) );
2010-08-31 23:59:59.000
この古い回答(下記)には、翌月よりも日数が多い月の最終日に機能しないというバグがあります。他の人への警告としてここに残しておきます。
現在の日付に1か月を加算してから、関数DAYおよびDATEADDを使用して、現在の日付に適用されたDAY関数によって返される値を減算します。
dateadd(day, -day(getdate()), dateadd(month, 1, getdate()))
SELECT DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-31T00:00:00.000')
説明:
一般的なアプローチ: 一時的な機能を使用します。
SELECT '1990-01-01T00:00:00.000', '1990-01-31T00:00:00.000'
これらは DATETIME リテラルであり、同じ 31 日の月のそれぞれ最初の日と最後の日の最初の時間グラニュルです。どの月を選択するかは完全に任意です。
SELECT DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP)
これは、参照月の最初の日と現在のタイムスタンプの間の月全体の差です。これを と呼びましょう@calc。
SELECT DATEADD(M, @calc, '1990-01-31T00:00:00.000')
@calcこれにより、参照月の最終日に月単位が追加され、その結果、現在のタイムスタンプがその月の最終日に「丸められた」ものになります。QED
これを試して:
DATEADD (DAY, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, CURRENT_TIMESTAMP) + 1, 0)
ポイントは、今月の初日、先月の末日、当月の末日を取得できるかどうかです。
以下は、クエリを作成するための段階的な方法です。
SQL Server では、日付は 1901/01/01 (日付 0) から始まり、現在までの各月は数字で識別できます。月 12 は 1902 年の最初の月で、1 月を意味します。月 1200 は 2001 年 1 月です。同様に、各日は一意の番号で割り当てることができます。たとえば、日付 0 は 1901/01/01 です。1901 年 1 月は 0 から始まるため、日付 31 は 1901/02/01 です。
今月の最初の日(現在の日付または指定された日付)を調べるには
- まず、日付 0 (1901/01/01) から何ヶ月が経過したかを確認する必要があります。SELECT DATEDIFF(MM,0,GETDATE())
- 日付0(1901/01/01)に同じ月数を足す
SELECT DATEADD(MM, DATEDIFF(MM,0,GETDATE()),0)
次に、今月の最初の日(現在の日付または指定された日付)を取得します
先月の最終日を取得するには
今月の最初の日から秒を引く必要があります
SELECT DATEADD(SS,-1,DATEADD(MM, DATEDIFF(MM,0,GETDATE()),0))
今月の最終日を取得するには
今月の最初の日を取得するために、最初に日付 0 (1901/01/01) から何ヶ月経過したかを確認しました。日付 0 以降の合計月数で別の月を追加し、日付 0 の合計月数を追加すると、翌月の最初の日になります。
SELECT DATEADD(MM, DATEDIFF(MM,0,GETDATE())+1,0)
翌月の初日を取得した場合、今月の最終日を取得するには、1 秒を引くだけで済みます。
SELECT DATEADD(SS,-1,DATEADD(MM, DATEDIFF(MM,0,GETDATE())+1,0))
それが役立つことを願っています。
SQL2005 を使用すると、便利な関数にアクセスできないため、EOMONTH()自分で計算する必要があります。
この単純な関数は、EOMONTHと同様に機能します。
CREATE FUNCTION dbo.endofmonth(@date DATETIME= NULL)
RETURNS DATETIME
BEGIN
RETURN DATEADD(DD, -1, DATEADD(MM, +1, DATEADD(DD, 1 - DATEPART(DD, ISNULL(@date,GETDATE())), ISNULL(@date,GETDATE()))))
END
実行するクエリ:
SELECT dbo.endofmonth(DEFAULT) --Current month-end date
SELECT dbo.endofmonth('02/25/2012') --User-defined month-end date
考えられる答えへのいくつかのリンク:
完全を期すために、Oracleでは次のようにします...
select add_months(trunc(sysdate,'MM'),1) ...
また
select last_day(sysdate)+1 ...
DECLARE
@Now datetime,
@Today datetime,
@ThisMonth datetime,
@NextMonth datetime,
@LastDayThisMonth datetime
SET @Now = getdate()
SET @Today = DateAdd(dd, DateDiff(dd, 0, @Now), 0)
SET @ThisMonth = DateAdd(mm, DateDiff(mm, 0, @Now), 0)
SET @NextMonth = DateAdd(mm, 1, @ThisMonth)
SET @LastDayThisMonth = DateAdd(dd, -1, @NextMonth)
今月の最後の日が本当に必要な場合もありますが、多くの場合、本当に必要なのは今月の時間間隔を記述することです。これは、今月の時間間隔を説明する最良の方法です。
WHERE @ThisMonth <= someDate and someDate < @NextMonth
DATEADD(dd, -1, DATEADD(mm, +1, DATEADD(dd, 1 - DATEPART(dd, @myDate), @myDate)))