web-dev-qa-db-ja.com

SQLで月の初日を選択するにはどうすればよいですか?

与えられたdatetime変数の月の初日を選択するだけです。

私はそれがこの種のコードを使ってすることは非常に簡単であることを知っています:

select CAST(CAST(YEAR(@mydate) AS VARCHAR(4)) 
+ '/' + CAST(MONTH(@mydate) AS VARCHAR(2)) + '/01' AS DATETIME)

しかし、これはあまり洗練されていませんし、おそらくあまり速くもありません。

これを行うより良い方法はありますか? SQL Server 2008を使用しています。

259
Brann
SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
514
LukeH

上記のすべての答えに加えて、sql 2012で導入された関数に基づく方法

SELECT DATEFROMPARTS(YEAR(@mydate),MONTH(@mydate),1)
110
Jithin Shaji

SQL Server 2008

SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1))
32
Marcos Krucken

Datetimeへの文字列(つまり "5/1/2009")のキャストは確かに読みやすくなりますが、しばらく前のコードでは月の最初の文字列が返されます。

DECLARE @Date DATETIME
//...
SELECT DATEADD(mm, DATEDIFF(mm,0,@Date), 0)
12
Mayo

簡単なクエリ:

SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) 
-- Instead of GetDate you can put any date.
8
Abhishek Gupta

それはおそらくかなり速いです。 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
5
dove

これもうまくいきます:

    SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth
4
Alan Burstein
SELECT @myDate - DAY(@myDate) + 1
2
PoloSoares

これを使ってください

  1. Server 2012の場合

    DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
    
  2. Server 2012より前

    select  cast(cast(year('2015-06-30') as varchar(4))+'-'+ cast(month('2015-06-30') as varchar(2))+'-01' as smalldatetime)
    
2
adnan umar
----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
2
kaub0st3r
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))
1
Brian Widdoes

将来のグーグラーは、MySQLでこれを試してみてください。

select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
1
Ariel T

今日これを見ていて、SQL Server 2012以降を使用している場合は、EOMONTH関数を使用すると作業が簡単になります。

SELECT DATEADD(day, 1, EOMONTH(DATEADD(month, -1, GETDATE()))) as firstdateofmonth

GETDATE()は任意の日付変数で変更できます。

1
Ang Li

SQL Server 2012以降を使用している場合

SELECT DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE())))
1
Lankymart

次のクエリを実行してください。

SELECT DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE-INTERVAL 1 DAY),INTERVAL 1 DAY),INTERVAL -1 MONTH)

1
divya

ここでは、月の最初の日付と月の最後の日付に対する以下のクエリを使用できます。

SELECT DATEADD(DAY,1,EOMONTH(Getdate(),-1)) as 'FD',Cast(Getdate()-1 as Date)
as 'LD'
1
Pradeep Thakur

私は個人的に私は条件句で日付関数を使用しようとすると、それは私のクエリ速度が非常に遅くなるので、以下のSQLをお勧めします。

とにかくこれを試してみてください。

select CONCAT(DATEPART(YYYY,@mydate),'-',DATEPART(MM,@mydate),'-01')
0
Jelly

使用する日付としてGETDATE()を使用しました。必要な日付に置き換えることができます。
これは次のように動作します。最初にYYYYMMDDで日付をフォーマットします... YYYYMM部分だけを保持するためにちょうど6つの左端の文字を保持するように切り捨ててから月として '01'を追加!今月の最初の日があります。

SELECT CAST(CONVERT(VARCHAR(6),GETDATE(),112) +'01' AS DATETIME) AS StartOfMonth

ところで、パフォーマンスはこれで素晴らしいです!

0
Eli

cONVERT(date、DATEADD(dd、 - (DATEPART(dd、getdate()) - 1)、getdate())、120)を選択してください。

この機能はあなたに月の開始日の日付部分を提供します

0
Tushar

Sql Server 2012では、

 select getdate()-DATEPART(day, getdate())+1

 select DATEADD(Month,1,getdate())-DATEPART(day, getdate())
0
BornToCode

このクエリはMySQLで非常にうまく機能するはずです。

SELECT concat(left(curdate(),7),'-01') 
0
user11869348

ここで偉大な心のどれとも競争しないように、しかし単純な提案は上で受け入れられた答えとわずかに異なる。

select dateadd(day, -(datepart(day,@date)+1,@date)
0
wayner

今月の最初の日と最後の日:

select dateadd(mm, -1,dateadd(dd, +1, eomonth(getdate()))) as FirstDay, 
eomonth(getdate()) as LastDay
0

私はFORMATを使いたいのですが、時間を指定することもできます

SELECT FORMAT(@myDate,'yyyy-MM-01 06:00') first_of_a_month
0
michal
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()を希望の日付に変更します。

0
Sayka