Как я вычисляю в последний день месяца в SQL?

Теперь мне нужно уничтожить класс «Пастух», чтобы закончить действия агента, а затем начать новую игру. Я знаю, что у классов Java есть деструкторы.

Вы неправильно поняли кое-что довольно фундаментальное:

  1. В Java нет деструкторов. Вы можете путать деструкторы с финализаторами. Это методы, которые называются после , когда GC решил удалить объект. (Это упрощение ... но реальная точка зрения заключается в том, что финализаторы не имеют отношения к этой проблеме. На самом деле, очень мало случаев, когда финализаторы имеют отношение.)

  2. Вы можете ' т уничтожить объекты. Объекты уничтожаются сборщиком мусора, когда они больше не нужны. Более конкретно, они уничтожаются, когда они недоступны; то есть когда они больше не могут влиять на выполнение программы.

Так что вы делаете?

Прежде всего, забудьте о «уничтожении» объектов. Вместо этого подумайте, как подготовить к следующей игре. Есть два подхода.

  1. Вы можете реализовать метод reset() или аналогичный для всех «игровых» объектов, которые необходимо сбросить / повторно инициализировать при запуске новой игры.

  2. Вы можете просто уронить все соответствующие «игровые» объекты на пол и создать новые. (GC позаботится о мусоре.)

Или вы можете использовать комбинацию двух подходов; например сбросить объект Pasture в исходное состояние и сбросить / воссоздать Shepard, Sheep и т. д.

6
задан Dana 8 October 2008 в 13:50
поделиться

7 ответов

Вот решение, которое дает Вам в последнюю секунду текущего месяца. Можно извлечь часть даты или изменить ее для возврата только дня. Я протестировал это на SQL Server 2005.

select dateadd( s, -1, dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 ) );

Чтобы понять, как это работает, мы должны посмотреть на dateadd () и datediff () функции.

DATEADD(datepart, number, date)  
DATEDIFF(datepart, startdate, enddate)

При выполнении просто самого внутреннего вызова к datediff (), Вы получаете текущее число месяца начиная с метки времени 0.

select datediff(m, 0, getdate() );  
1327

Следующая часть добавляет что число месяцев плюс 1 к этим 0 меткам времени, давая Вам начальную точку следующего календарного месяца.

select dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 );
2010-09-01 00:00:00.000

Наконец, внешний dateadd () просто вычитает одну секунду из начинающейся метки времени следующего месяца, давая Вам в последнюю секунду текущего месяца.

select dateadd( s, -1, dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 ) );
2010-08-31 23:59:59.000


Этот старый ответ (ниже) имеет ошибку, где он не работает в прошлый день месяца, который имеет больше дней, чем следующий месяц. Я оставляю его здесь как предупреждение другим.

Добавьте один месяц к текущей дате и затем вычтите значение, возвращенное дневной функцией, относился к текущей дате с помощью ДНЯ функций и DATEADD.

dateadd(day, -day(getdate()), dateadd(month, 1, getdate()))
18
ответ дан 8 December 2019 в 03:40
поделиться

Попробуйте это:

DATEADD (DAY, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, CURRENT_TIMESTAMP) + 1, 0)
3
ответ дан 8 December 2019 в 03:40
поделиться
SELECT DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-31T00:00:00.000')

Объяснение:

Общий подход: используйте временную функциональность.

SELECT '1990-01-01T00:00:00.000', '1990-01-31T00:00:00.000'

Это литералы ДАТЫ И ВРЕМЕНИ, будучи в первый раз гранулой в первый день и в последний день соответственно того же 31-дневного месяца. То, какой месяц выбран, совершенно произвольно.

SELECT DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP)

Вот в чем разница в целых месяцах между первым днем ссылочного месяца и текущей меткой времени. Давайте назовем это @calc.

SELECT DATEADD(M, @calc, '1990-01-31T00:00:00.000')

Это добавляет @calc гранулы месяца к прошлому дню ссылочного месяца, результатом которого является текущая метка времени, 'округленная' к прошлому дню ее месяца. Q.E. D.

4
ответ дан 8 December 2019 в 03:40
поделиться
DECLARE
  @Now datetime,
  @Today datetime,
  @ThisMonth datetime,
  @NextMonth datetime,
  @LastDayThisMonth datetime

SET @Now = getdate()
SET @Today = DateAdd(dd, DateDiff(dd, 0, @Now), 0)
SET @ThisMonth = DateAdd(mm, DateDiff(mm, 0, @Now), 0)
SET @NextMonth = DateAdd(mm, 1, @ThisMonth)
SET @LastDayThisMonth = DateAdd(dd, -1, @NextMonth)

Иногда Вам действительно нужно в последний день этого месяца, но часто то, что Вы действительно хотите, должно описать временной интервал этого месяца. Это - лучший способ описать временной интервал этого месяца:

WHERE @ThisMonth <= someDate and someDate < @NextMonth
0
ответ дан 8 December 2019 в 03:40
поделиться

Для полноты в Oracle Вы сделали бы что-то как...

select add_months(trunc(sysdate,'MM'),1) ...

или

select last_day(sysdate)+1 ...
0
ответ дан 8 December 2019 в 03:40
поделиться
DATEADD(dd, -1, DATEADD(mm, +1, DATEADD(dd, 1 - DATEPART(dd, @myDate), @myDate)))
0
ответ дан 8 December 2019 в 03:40
поделиться