Ответ 1
SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
Мне просто нужно выбрать первый день месяца для данной переменной 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 2012:
SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1))
Кастинг строки (т.е. "5/1/2009" ) в datetime, безусловно, более разборчив, но мы нашли код в то время назад, который вернул бы первый месяц...
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
Пожалуйста, используйте этот
Для сервера 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
Будущие googlers, на MySQL, попробуйте это:
select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
Если вы смотрите на это сегодня и используя SQL-сервер 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())))
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/2018.. и т.д. И т.д.
или же
DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(@mydate,-1))
Попробуйте выполнить следующий запрос:
SELECT DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE-INTERVAL 1 DAY),INTERVAL 1 DAY),INTERVAL -1 MONTH)
Первый и последний день текущего месяца:
select dateadd(mm, -1,dateadd(dd, +1, eomonth(getdate()))) as FirstDay,
eomonth(getdate()) as LastDay
выберите CONVERT (дата, DATEADD (dd, - (DATEPART (dd, getdate()) - 1), getdate()), 120)
Эта функция предоставит вам дату начала даты начала месяца
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() на нужную дату.
Я использовал GETDATE() как дату для работы, вы можете заменить ее на нужную вам дату.
Вот как это работает: сначала мы отформатируем дату в формате YYYYMMDD..., чтобы убрать только 6 левых символов, чтобы сохранить только часть YYYYMM, а затем добавить "01" в качестве месяца - и вуаля! у вас есть первый день текущего месяца.
SELECT CAST(CONVERT(VARCHAR(6),GETDATE(),112) +'01' AS DATETIME) AS StartOfMonth
Кстати, производительность на этом отлично!
Я лично рекомендовал, чтобы sql был ниже, потому что, когда я пытаюсь использовать функцию даты в условии условия, это очень замедляет мою скорость запроса.
в любом случае не стесняйтесь попробовать это.
select CONCAT(DATEPART(YYYY,@mydate),'-',DATEPART(MM,@mydate),'-01')
Не конкурировать с любым из великих умов здесь, но простое предложение немного отличается от принятого ответа выше.
select dateadd(day, -(datepart(day,@date)+1,@date)
Мне нравится использовать FORMAT
, вы даже можете указать время
SELECT FORMAT(@myDate,'yyyy-MM-01 06:00') first_of_a_month
В 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 left(convert(varchar, getdate(),23),7)+'-01 00:00:00'
Это кажется глупо простым, но работает для меня:
select DATE_FORMAT(NOW(), '%Y-%m-1')