Як отримати першу та останню дату поточного року?


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

Наведений вище запит дає значення часової дати для півночі на початок 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
Це виводить рядки, а не дати. Якщо це вам дійсно потрібно, так, але якщо ви можете використовувати будь-яке, зберігайте дати як дати, а не використовуйте їх як рядки.
Джеймі Ф

2
Я не згоден, OP не вказав, і формат даних, встановлений на сервері sql, може повернути щось на кшталт "2012-01-01 12:13:14" замість '01 /
01/2012

1
@RandyMorris, погодьтеся, ОП запитував, чи може він отримати DATETIMEзамість рядка і, очевидно, що може не відповідати очікуваному результату відповідно до питання.
Вікдор

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

1
@Damien_The_Unbeliever, запит у відповіді повинен відповідати очікуваному результату відповідно до питання. Коментар про DATETIME - це відповідь на коментар ОП щодо отримання дати замість рядка. Відповідь не відображає цю дискусію.
Вікдор

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 Залежно від налаштувань локалізації сервера, я думаю, що це іноді призведе до помилки.
Джеймі Ф

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 :: текст, '- 01-01') :: дата;
бормат

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';

Те саме стосується DAY () та MONTH () . Вони також доступні для варіантів 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 - ці дві функції застосовані так, що ми можемо перетворити це у варшар, який можна конкретизувати з потрібним префіксом (у цьому випадку це або перша дата року, або остання дата року). З будь-якої причини результат, згенерований функцією 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 (і переносить дати до рядків, що є одним із моїх вихованців).
Альваро Гонсалес

-3

--- демонстрації Lalmuni ---

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.