Доберитесь в последний день месяца в SQL

C ++ - язык будущего убийцы ...

... динамических языков.

никто не владеет им, имеет растущий набор функций, таких как программирование во время компиляции (мета) или вывод типов, обратные вызовы без накладных расходов на вызовы функций, не реализует единый подход (мультипарадигма). Регулярные выражения POSIX и ECMAScript . несколько возвращаемых значений . Вы можете иметь именованных аргументов . и т. д.

В программировании все происходит очень медленно. JavaScript потребовалось 10 лет, чтобы оторваться от земли (в основном из-за производительности), и большинство людей, которые в нем программируют, все еще не получают его (классы в JS? c'mon!). Я бы сказал, что C ++ действительно начнет светить через 15-20 лет. мне кажется, что для C ++ (как языка, так и для поставщиков компиляторов) достаточно времени и критической массы программистов, которые сегодня пишут на динамических языках, чтобы сходиться.

C ++ должен стать более дружественным к программисту (ошибки компилятора, сгенерированные из шаблонов или время компиляции при их наличии), и программисты должны понять, что статическая типизация - это благо (это уже происходит, см. Другой ответ здесь, который утверждает, что хороший код, написанный на динамически типизированном языке, написан так, как если бы язык был статически типизирован).

46
задан dakab 20 January 2017 в 10:22
поделиться

5 ответов

Вот моя версия. Никаких манипуляций со строками или преобразований не требуется, всего по одному вызову функций DATEADD , YEAR и MONTH :

DECLARE @test DATETIME
SET @test = GETDATE()  -- or any other date

SELECT DATEADD(month, ((YEAR(@test) - 1900) * 12) + MONTH(@test), -1)
60
ответ дан 26 November 2019 в 20:04
поделиться

Если он вам нужен часто, оберните его во встроенный TVF, что очень быстро:

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/06/21 /calculating-third-wednesday-of-the-month-with-inline-udfs.aspx ,

0
ответ дан 26 November 2019 в 20:04
поделиться

Мои 2 цента:

select DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(day,(0-(DATEPART(dd,'2008-02-12')-1)),'2008-02-12')))

Радж

0
ответ дан 26 November 2019 в 20:04
поделиться

Просто немного расширите формулу:

dateadd(day, -1,
    dateadd(month, 1,
        cast(month('5/15/2009') as varchar(2)) + 
        '/1/' + 
        cast(year('5/15/2009') as varchar(4)))
2
ответ дан 26 November 2019 в 20:04
поделиться

Вы можете получить дни в дате с помощью функции DAY () :

dateadd(day, -1, dateadd(month, 1, dateadd(day, 1 - day(date), date)))
13
ответ дан 26 November 2019 в 20:04
поделиться