Как выбрать первый день месяца в SQL? - PullRequest
264 голосов
/ 05 октября 2009

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

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

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

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

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

Ответы [ 25 ]

526 голосов
/ 05 октября 2009
SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
114 голосов
/ 22 октября 2014

В дополнение ко всему вышеприведенному ответу, способ основан на функции, введенной в sql 2012

SELECT DATEFROMPARTS(YEAR(@mydate),MONTH(@mydate),1)
33 голосов
/ 04 августа 2014

Начиная с SQL Server 2012:

SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1))
12 голосов
/ 05 октября 2009

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

DECLARE @Date DATETIME
//...
SELECT DATEADD(mm, DATEDIFF(mm,0,@Date), 0)
9 голосов
/ 02 апреля 2015

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

SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) 
-- Instead of GetDate you can put any date.
5 голосов
/ 05 октября 2009

Это, вероятно, довольно быстро. Почему бы не создать его как функцию 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
4 голосов
/ 03 августа 2013

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

    SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth
2 голосов
/ 10 июля 2014
SELECT @myDate - DAY(@myDate) + 1
2 голосов
/ 26 июня 2015

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

  1. Для сервера 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)
    
2 голосов
/ 04 декабря 2018
----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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...