与えられたdatetime変数の月の初日を選択するだけです。
私はそれがこの種のコードを使ってすることは非常に簡単であることを知っています:
select CAST(CAST(YEAR(@mydate) AS VARCHAR(4))
+ '/' + CAST(MONTH(@mydate) AS VARCHAR(2)) + '/01' AS DATETIME)
しかし、これはあまり洗練されていませんし、おそらくあまり速くもありません。
これを行うより良い方法はありますか? SQL Server 2008を使用しています。
SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
上記のすべての答えに加えて、sql 2012
で導入された関数に基づく方法
SELECT DATEFROMPARTS(YEAR(@mydate),MONTH(@mydate),1)
SQL Server 2008
SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1))
Datetimeへの文字列(つまり "5/1/2009")のキャストは確かに読みやすくなりますが、しばらく前のコードでは月の最初の文字列が返されます。
DECLARE @Date DATETIME
//...
SELECT DATEADD(mm, DATEDIFF(mm,0,@Date), 0)
簡単なクエリ:
SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
-- Instead of GetDate you can put any date.
それはおそらくかなり速いです。 SQL関数として作成しないのはなぜでしょうか。
CREATE FUNCTION [dbo].[GetFirstDayOfMonth] ( @InputDate DATETIME )
RETURNS DATETIME
BEGIN
RETURN CAST(CAST(YEAR(@InputDate) AS VARCHAR(4)) + '/' +
CAST(MONTH(@InputDate) AS VARCHAR(2)) + '/01' AS DATETIME)
END
GO
これもうまくいきます:
SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth
SELECT @myDate - DAY(@myDate) + 1
これを使ってください
Server 2012の場合
DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
Server 2012より前
select cast(cast(year('2015-06-30') as varchar(4))+'-'+ cast(month('2015-06-30') as varchar(2))+'-01' as smalldatetime)
----Last Day of Previous Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
LastDay_PreviousMonth
----Last Day of Current Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
LastDay_CurrentMonth
----Last Day of Next Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0))
LastDay_NextMonth
DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(Getdate(),-2))
-2は先月の初日になります。つまり、getdate()は10/15/18です。あなたの結果は9/1/18でしょう。 -1に変更すると、結果は10/1/18になります。 0が来月の始まり、11/1/20、..などとなります。
または
DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(@mydate,-1))
将来のグーグラーは、MySQLでこれを試してみてください。
select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
今日これを見ていて、SQL Server 2012以降を使用している場合は、EOMONTH関数を使用すると作業が簡単になります。
SELECT DATEADD(day, 1, EOMONTH(DATEADD(month, -1, GETDATE()))) as firstdateofmonth
GETDATE()は任意の日付変数で変更できます。
SQL Server 2012以降を使用している場合
SELECT DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE())))
次のクエリを実行してください。
SELECT DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE-INTERVAL 1 DAY),INTERVAL 1 DAY),INTERVAL -1 MONTH)
ここでは、月の最初の日付と月の最後の日付に対する以下のクエリを使用できます。
SELECT DATEADD(DAY,1,EOMONTH(Getdate(),-1)) as 'FD',Cast(Getdate()-1 as Date)
as 'LD'
私は個人的に私は条件句で日付関数を使用しようとすると、それは私のクエリ速度が非常に遅くなるので、以下のSQLをお勧めします。
とにかくこれを試してみてください。
select CONCAT(DATEPART(YYYY,@mydate),'-',DATEPART(MM,@mydate),'-01')
使用する日付としてGETDATE()を使用しました。必要な日付に置き換えることができます。
これは次のように動作します。最初にYYYYMMDDで日付をフォーマットします... YYYYMM部分だけを保持するためにちょうど6つの左端の文字を保持するように切り捨ててから月として '01'を追加!今月の最初の日があります。
SELECT CAST(CONVERT(VARCHAR(6),GETDATE(),112) +'01' AS DATETIME) AS StartOfMonth
ところで、パフォーマンスはこれで素晴らしいです!
cONVERT(date、DATEADD(dd、 - (DATEPART(dd、getdate()) - 1)、getdate())、120)を選択してください。
この機能はあなたに月の開始日の日付部分を提供します
Sql Server 2012では、
select getdate()-DATEPART(day, getdate())+1
select DATEADD(Month,1,getdate())-DATEPART(day, getdate())
このクエリはMySQLで非常にうまく機能するはずです。
SELECT concat(left(curdate(),7),'-01')
ここで偉大な心のどれとも競争しないように、しかし単純な提案は上で受け入れられた答えとわずかに異なる。
select dateadd(day, -(datepart(day,@date)+1,@date)
今月の最初の日と最後の日:
select dateadd(mm, -1,dateadd(dd, +1, eomonth(getdate()))) as FirstDay,
eomonth(getdate()) as LastDay
私はFORMAT
を使いたいのですが、時間を指定することもできます
SELECT FORMAT(@myDate,'yyyy-MM-01 06:00') first_of_a_month
SELECT DATEADD (DAY, -1 * (DAY(GETDATE()) - 1), GETDATE())
................................................ ...................
時間が不要な場合は、DATEに変換するか、0:00:00にしたい場合は、DATEに変換してからDATETIMEに戻します。
SELECT CONVERT (DATETIME,
CONVERT (DATE, DATEADD (DAY, -1 * (DAY(GETDATE()) - 1),
GETDATE())))
GETDATE()を希望の日付に変更します。