Как получить первую и последнюю дату текущего года?


110

Как я могу получить первую и последнюю дату текущего года, используя SQL Server 2000?

Ожидаемый результат:

01/01/2012 и 31/12/2012

Ответы:


237
SELECT
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear

Вышеупомянутый запрос дает значение datetime для полуночи в начале 31 декабря. Это примерно на 24 часа меньше последнего момента года. Если вы хотите включить время, которое может произойти 31 декабря, вам следует сравнить с первым годом следующего года <. Или вы можете сравнить с несколькими последними миллисекундами текущего года, но это все равно оставляет пробел, если вы используете что-то другое, кроме DATETIME (например, DATETIME2):

SELECT
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS LastDayOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0) AS FirstOfNextYear,
   DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0)) AS LastTimeOfYear

Технические детали

Это работает путем вычисления количества лет, прошедших с 1900 года, с DATEDIFF(yy, 0, GETDATE())последующим добавлением этого числа к дате, равной нулю = 1 января 1900 года. Это можно изменить для работы с произвольной датой, заменив GETDATE()часть или произвольный год, заменив DATEDIFF(...)функцию на «Год - 1900».

 SELECT
   DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
   DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015

13

Вот довольно простой способ;

SELECT DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS 'First Day of Current Year';
SELECT DATEFROMPARTS(YEAR(GETDATE()), 12, 31) AS 'End of Current Year';

Это не сексуально, но работает.


1
Доступно только с Sql Server 2012.
Лукас,

12

Вы можете получить текущий год с помощью DATEPARTфункции, начиная с текущей даты, полученной с помощьюgetUTCDate()

SELECT 
    '01/01/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate())), 
    '31/12/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate()))

1
Это выводит строки, а не даты. Если это то, что вам действительно нужно, ура, но если вы можете использовать и то, и другое, сохраняйте даты как даты и не используйте их как строки.
Jamie F

2
Я не согласен, OP не указал, и набор форм данных на сервере sql может возвращать что-то вроде «2012-01-01 12:13:14» вместо «
01/01/2012

1
@RandyMorris, согласитесь, OP спрашивал, может ли он получить DATETIMEвместо строки, и, очевидно, это может не соответствовать ожидаемому результату в соответствии с вопросом.
Vikdor

1
Зачем использовать неоднозначный формат даты (а строки в вашем ответе не соответствуют формату в вашем комментарии)? yyyyMMddоднозначно.
Damien_The_Unbeliever

1
@Damien_The_Unbeliever, запрос в ответе должен соответствовать ожидаемому результату в соответствии с вопросом. Комментарий о DATETIME - это ответ на комментарий OP о получении даты вместо строки. Ответ не отражает этого обсуждения.
Vikdor

7

просто напишите: -

select convert (date,DATEADD(YEAR,DATEDIFF(YEAR,0,GETDATE()),0))

дата начала года.

select convert (date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 1, -1))  

4

Каждый год имеет 1-ю как первую дату и 31 как последнюю дату, что вам нужно сделать, это только присоединить год к этому дню и месяцу, например: -

 SELECT '01/01/'+cast(year(getdate()) as varchar(4)) as [First Day],
 '12/31/'+cast(year(getdate()) as varchar(4)) as [Last Day]

1
Это не обязательно так, поскольку программисты верят в ложь о времени .
krillgar

Можно ли привести пример, когда это не сработает?
slayernoah

@slayernoah В зависимости от настроек локализации сервера, я думаю, иногда это приводит к ошибке.
Jamie F

3

Чтобы получить первый и последний день года, можно использовать CONCATфункцию. Результирующее значение может быть приведено к любому типу.

CONCAT(YEAR(Getdate()),'-01-01') FirstOfYear,
CONCAT(YEAR(GETDATE()),'-12-31') LastOfYear

Год у меня не работает, но date_part работает start_year_date: = CONCAT (date_part ('Y', start_date_p) :: int :: text, '- 01-01') :: date;
бормат

1

На дату начала текущего года:

SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())

На дату окончания текущего года:

SELECT DATEADD(DD,-1,DATEADD(YY,DATEDIFF(YY,0,GETDATE())+1,0))

1

Другой способ: (Начиная с SQL Server 2012)

SELECT
    DATEFROMPARTS(YEAR(GETDATE()), 1, 1) FirstDay,
    DATEFROMPARTS(YEAR(GETDATE()),12,31) LastDay

0

Посмотрите на это:

select convert(varchar(12),(DateAdd(month,(Month(getdate())-1) * -1, DateAdd(Day,(Day(getdate())-1) * -1,getdate()))),103) as StartYear,
       convert(varchar(12),DateAdd(month,12 - Month(getdate()), DateAdd(Day,(31 - Day(getdate())),getdate())),103) as EndYear


0
print Cast('1/1/' + cast(datepart(yyyy, getdate()) as nvarchar(4)) as date)

Вы должны объяснить свой код. Дампы кода часто отвергаются и могут быть удалены.
Ошибки

0

Похоже, вам интересно выполнять все операции за данный год, если это действительно так, я бы рекомендовал использовать функцию YEAR () следующим образом:

SELECT * FROM `table` WHERE YEAR(date_column) = '2012';

То же самое касается ДЕНЬ () и МЕСЯЦ () . Они также доступны для вариантов MySQL / MariaDB и были введены в SQL Server 2008 (то есть не для конкретного 2000 года).


-1
select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31') 
from dual

Это для PL-SQL, говорится в сообщении SQL Server 2000, поэтому вам нужно использовать T-SQL. To_Date и Sysdate не существуют в T-SQL
Эндрю Фейлор

-1

В Microsoft SQL Server (T-SQL) это можно сделать следующим образом

--beginning of year
select '01/01/' + LTRIM(STR(YEAR(CURRENT_TIMESTAMP)))

--end of year
select '12/31/' + LTRIM(STR(YEAR(CURRENT_TIMESTAMP)))

CURRENT_TIMESTAMP - возвращает дату sql-сервера на момент выполнения запроса.

ГОД - получает часть года текущей отметки времени.

STR , LTRIM - эти две функции применяются, чтобы мы могли преобразовать их в varchar, который можно объединить с нашим желаемым префиксом (в данном случае это либо первая дата года, либо последняя дата года). По какой-то причине результат, сгенерированный функцией YEAR, имеет пробелы в префиксе. Чтобы исправить их, мы используем функцию LTRIM, которая является обрезкой слева.


-1

Если он достигнет 1 января, возможно, это будет дата последнего года.

select
convert(date, DATEADD(yy, DATEDIFF(yy, 0,  DATEadd(day, -1,getdate())), 0), 103 ) AS StartOfYear,
convert(date, DATEADD(yy, DATEDIFF(yy, 0, DATEDIFF(day, -1,getdate()))+1, -1), 103 )AS EndOfYear

-2

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

DATE_FORMAT(NOW(),'01/01/%Y')
DATE_FORMAT(NOW(),'31/12/%Y')

Microsoft SQL Server. Msg 195, Level 15, State 10, Line 1 'NOW' is not a recognized function name.
jumxozizi

В этом ответе используются функции MySQL (и приводятся даты к строкам, что является одной из моих любимых мозолей).
Álvaro González

-3

--- Лалмуни Демос ---

create table Users
(
userid int,date_of_birth date
)

--- вставить значения ---

insert into Users values(4,'9/10/1991')

select DATEDIFF(year,date_of_birth, getdate()) - (CASE WHEN (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()),date_of_birth)) > getdate() THEN 1 ELSE 0 END) as Years, 
MONTH(getdate() - (DATEADD(year, DATEDIFF(year, date_of_birth, getdate()), date_of_birth))) - 1 as Months, 
DAY(getdate() - (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()), date_of_birth))) - 1 as Days,
from users
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.