Как выбрать первый день месяца в SQL?

Мне просто нужно выбрать первый день месяца для данной переменной datetime.

Я знаю, что это довольно легко сделать с помощью такого кода:

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

Но это не очень элегантно и, вероятно, не очень быстро.

Есть лучший способ сделать это? Я использую SQL Server 2008.

36 ответов

Решение
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))

Из SQL Server 2022 вы можете использоватьDATETRUNC

      SELECT DATETRUNC(month, @mydate)

для этого нужно

Простой запрос:

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

Приведение строки (то есть "01.05.2009") к datetime, безусловно, более разборчиво, но некоторое время назад мы нашли код, который вернул бы первое число месяца...

DECLARE @Date DATETIME
//...
SELECT DATEADD(mm, DATEDIFF(mm,0,@Date), 0)
SELECT @myDate - DAY(@myDate) + 1

Это может быть новая функция, но вы также можете использовать старые функции:

select DATEFROMPARTS(year(@mydate),month(@mydate),'01')

Если дата в переменной была, например, '2017-10-29'он вернет дату '2017-10-01'

https://docs.microsoft.com/en-us/sql/t-sql/functions/datefromparts-transact-sql?view=sql-server-ver15

Если вы хотите использовать sql server 2012+, вы можете попробовать решение, которое я использовал:

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

Это, вероятно, довольно быстро. Почему бы не создать его как функцию 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(mm, -1,dateadd(dd, +1, eomonth(getdate()))) as FirstDay, 
eomonth(getdate()) as LastDay

Это тоже работает:

    SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth

Пожалуйста, используйте это

  1. Для сервера 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)
    

Я использовал GETDATE() в качестве даты для работы, вы можете заменить ее на нужную вам дату.
Вот как это работает: сначала мы форматируем дату в формате ГГГГММДД… усекаем ее, оставляя только 6 крайних левых символов, чтобы оставить только часть ГГГГММ, а затем добавляем "01" в качестве месяца - и вуаля! у вас первый день текущего месяца.

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

Кстати, производительность отличная на этом!

Этот запрос должен очень хорошо работать в MySQL:

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

Будущие Google, на MySQL, попробуйте это:

select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
----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() -15.10.18. Ваши результаты будут 9/1/18. Измените на -1, и ваши результаты будут 10/1/18. 0 будет началом следующего месяца, 1.11.08.. и т. Д.

или же

DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(@mydate,-1))
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() на желаемую дату

Здесь мы можем использовать приведенный ниже запрос к первой дате месяца и последней дате месяца.

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

Если используется SQL Server 2012 или выше;

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

Если вы посмотрите на это сегодня и используете SQL Server 2012 или новее, у вас есть функция EOMONTH, которая делает вещи проще:

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

Вы можете изменить GETDATE() с любой переменной даты, которую вы хотите.

Вы можете использовать функцию ниже для получения 1-го дня текущего месяца:

      DECLARE @mydate date
set @mydate=GETDATE()
SELECT DATEFROMPARTS(YEAR(@mydate),MONTH(@mydate),1)

Попробуйте выполнить следующий запрос:

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

Выберите CONVERT(дата,DATEADD(дд,-(DATEPART(дд,getdate())-1),getdate()),120)

Эта функция предоставит вам часть даты начала месяца

мое решение:

      SELECT DATE_ADD(CURDATE(), 1 - DAY(CURDATE()))

Я лично рекомендовал sql ниже, потому что, когда я пытаюсь использовать функцию даты в условии условия, она сильно замедляет мою скорость запроса.

в любом случае, не стесняйтесь попробовать это.

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

Не для того, чтобы конкурировать с кем-либо из великих умов здесь, но простое предложение, немного отличающееся от принятого ответа выше.

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

Попробуйте следующее:

      select trunc(sysdate,'MM') 
from dual;

Попробуйте следующее:

      select trunc(to_date('23-03-2021','DD-MM-YYYY'),'MM') from dual;
Другие вопросы по тегам