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

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

Я знаю, что это довольно легко сделать, используя такой код:

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

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

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

19 ответов


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))

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

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

Это, вероятно, довольно быстро. Почему бы не создать его как функцию 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 DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) 
-- Instead of GetDate you can put any date.

SELECT @myDate - DAY(@myDate) + 1

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

  1. Для Server 2012

    DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
    
  2. Перед Сервером 2012

    select  cast(cast(year('2015-06-30') as varchar(4))+'-'+ cast(month('2015-06-30') as varchar(2))+'-01' as smalldatetime)
    

будущие гуглеры, на 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 () с любой переменной даты, которую вы хотите.


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

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())))

выберите конвертировать (дата, DATEADD (dd, - (DATEPART(dd, getdate ()) -1), getdate ()), 120)

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


SELECT DATEADD (DAY, -1 * (DAY(GETDATE()) - 1), GETDATE())

.....................................................................

Если вы не хотите время, а затем преобразовать его в дату или если вы хотите, чтобы время в 0:00: 00, преобразовать в дату, а затем обратно в DATETIME.

SELECT CONVERT (DATETIME,  
CONVERT (DATE, DATEADD (DAY, -1 * (DAY(GETDATE()) - 1),
GETDATE())))

изменить GETDATE () на дату, которую вы хотите


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

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

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


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

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

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

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

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

Это кажется глупо простым, но работает для меня:

  select DATE_FORMAT(NOW(), '%Y-%m-1')