Como obter a primeira e a última data do ano atual?


110

Usando o SQL Server 2000, como posso obter a primeira e a última data do ano atual?

Resultado esperado:

01/01/2012 e 31/12/2012

Respostas:


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

A consulta acima fornece um valor de data e hora para meia-noite no início de 31 de dezembro. Isso é cerca de 24 horas antes do último momento do ano. Se quiser incluir o tempo que pode ocorrer em 31 de dezembro, você deve comparar com o primeiro do próximo ano, com uma <comparação. Ou você pode comparar com os últimos milissegundos do ano atual, mas isso ainda deixa uma lacuna se você estiver usando algo diferente de DATETIME (como 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

Detalhes técnicos

Isso funciona calculando o número de anos desde 1900 com DATEDIFF(yy, 0, GETDATE())e, em seguida, adicionando isso a uma data de zero = 1 de janeiro de 1900. Isso pode ser alterado para funcionar para uma data arbitrária, substituindo a GETDATE()parte ou um ano arbitrário, substituindo a DATEDIFF(...)função por "Ano - 1900."

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

13

Aqui está uma maneira bastante simples;

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

Não é sexy, mas funciona.


1
Disponível apenas a partir do Sql Server 2012.
Lukas

12

Você pode obter o ano atual usando a DATEPARTfunção, a partir da data atual obtida usandogetUTCDate()

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

1
Isso gera strings, não datas. Se é disso que você realmente precisa, sim, mas se você pode usar qualquer um, mantenha as datas como datas e não as use como strings.
Jamie F

2
Eu discordo, OP não especificou e o formet de dados definido no servidor sql pode retornar algo como '2012-01-01 12:13:14' em vez de '01 / 01/2012 '
RandyMorris

1
@RandyMorris, concordo, o OP estava perguntando se ele pode obter em DATETIMEvez de string e obviamente isso pode não corresponder à saída esperada de acordo com a pergunta.
Vikdor 18/11/12

1
Por que você usaria um formato de data ambíguo (e as strings em sua resposta não correspondem ao formato em seu comentário)? yyyyMMddé inequívoco.
Damien_The_Unbeliever

1
@Damien_The_Unbeliever, a consulta na resposta deve corresponder à saída esperada de acordo com a pergunta. O comentário sobre DATETIME é uma resposta ao comentário do OP sobre a obtenção de data em vez de string. A resposta não reflete essa discussão.
Vikdor

7

simplesmente escreva: -

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

data de início do ano.

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

4

Todo ano tem o 1º como primeiro dia e 31 como último o que você deve fazer é apenas anexar o ano a esse dia e mês, por exemplo: -

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

1
Isso não é necessariamente verdade, pois existem muitas mentiras que os programadores acreditam sobre o tempo .
Krillgar

Alguém poderia dar um exemplo de quando isso não funcionará?
slayernoah

@slayernoah Dependendo das configurações de localização do servidor, acho que às vezes isso gera um erro.
Jamie F

3

Para obter o primeiro e o último dia do ano, pode-se usar a CONCATfunção. O valor resultante pode ser convertido para qualquer tipo.

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

Ano não funciona para mim, mas date_part funciona data_do_início: = CONCAT (data_de_data ('Y', data_de_inicio_p) :: int :: text, '- 01-01') :: data;
bormat

1

Para data de início do ano atual:

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

Para data de término do ano atual:

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

1

Outra forma: (desde o SQL Server 2012)

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

0

Confira este aqui:

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)

Você deve explicar seu código. Despejos de código são frequentemente rejeitados e podem ser excluídos.
Bugs de

0

Parece que você tem interesse em realizar uma operação de tudo para um determinado ano, se for esse o caso, recomendo usar a função YEAR () assim:

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

O mesmo vale para DIA () e MÊS () . Eles também estão disponíveis para variantes do MySQL / MariaDB e foram introduzidos no SQL Server 2008 (portanto, não para o 2000 específico).


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

Isso é para PL-SQL, post diz SQL Server 2000, então você tem que usar T-SQL. To_Date e Sysdate não existem no T-SQL
Andrew Failor

-1

No Microsoft SQL Server (T-SQL), isso pode ser feito da seguinte maneira

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

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

CURRENT_TIMESTAMP - retorna a data do servidor sql no momento da execução da consulta.

YEAR - obtém a parte do ano do carimbo de hora atual.

STR , LTRIM - essas duas funções são aplicadas para que possamos converter isso em um varchar que pode ser concatinado com nosso prefixo desejado (neste caso, é a primeira data do ano ou a última data do ano). Por alguma razão, o resultado gerado pela função YEAR tem espaços de prefixo. Para corrigi-los, usamos a função LTRIM que é trim à esquerda.


-1

Se chegar a 1 de janeiro, pode ser que seja ainda a data do ano passado.

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

Experimente isto:

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

Esta resposta usa funções MySQL (e converte datas em strings, o que é uma das minhas queixas preferidas).
Álvaro González

-3

--- Lalmuni Demos ---

create table Users
(
userid int,date_of_birth date
)

--- inserir valores ---

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.