¿Cómo obtener la primera y la última fecha del año actual?

110

Con SQL Server 2000, ¿cómo puedo obtener la primera y la última fecha del año actual?

Rendimiento esperado:

01/01/2012 y 31/12/2012

Gopal
fuente

Respuestas:

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

La consulta anterior da un valor de fecha y hora para la medianoche al comienzo del 31 de diciembre. Esto es aproximadamente 24 horas antes del último momento del año. Si desea incluir el tiempo que podría ocurrir el 31 de diciembre, debe compararlo con el primero del próximo año, con una <comparación. O puede comparar con los últimos milisegundos del año actual, pero esto todavía deja un espacio si está usando algo que no sea 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

Detalles técnicos

Esto funciona calculando el número de años desde 1900 con DATEDIFF(yy, 0, GETDATE())y luego agregándolo a una fecha de cero = 1 de enero de 1900. Esto se puede cambiar para que funcione para una fecha arbitraria reemplazando la GETDATE()parte o un año arbitrario reemplazando la DATEDIFF(...)función con "Año - 1900".

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

He aquí una forma bastante sencilla;

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

No es sexy, pero funciona.

Aubrey Love
fuente
1
Solo disponible a partir de Sql Server 2012.
Lukas
12

Puede obtener el año actual usando la DATEPARTfunción, a partir de la fecha actual obtenida usandogetUTCDate()

SELECT 
    '01/01/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate())), 
    '31/12/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate()))
Vikdor
fuente
1
Esto genera cadenas, no fechas. Si eso es lo que realmente necesita, sí, pero si puede usar cualquiera, mantenga las fechas como fechas y no las use como cadenas.
Jamie F
2
No estoy de acuerdo, OP no especificó y los datos configurados en el servidor SQL podrían devolver algo como '2012-01-01 12:13:14' en lugar de '01 /
01/2012
1
@RandyMorris, de acuerdo, el OP estaba preguntando si puede obtener en DATETIMElugar de una cadena y, obviamente, eso puede no coincidir con el resultado esperado según la pregunta.
Vikdor
1
¿Por qué usaría un formato de fecha ambiguo (y las cadenas de su respuesta no coinciden con el formato de su comentario)? yyyyMMddes inequívoco.
Damien_The_Unbeliever
1
@Damien_The_Unbeliever, la consulta en la respuesta debe coincidir con el resultado esperado según la pregunta. El comentario sobre DATETIME es una respuesta al comentario de OP sobre cómo obtener la fecha en lugar de la cadena. La respuesta no refleja esta discusión.
Vikdor
7

simplemente escribe: -

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

fecha de inicio del año.

select convert (date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 1, -1))  
Pradeep atkari
fuente
4

Cada año tiene el 1 como la primera fecha y el 31 como la última fecha, lo que debe hacer es solo adjuntar el año a ese día y mes, por ejemplo: -

 SELECT '01/01/'+cast(year(getdate()) as varchar(4)) as [First Day],
 '12/31/'+cast(year(getdate()) as varchar(4)) as [Last Day]
Rahul Tripathi
fuente
1
Esto no es necesariamente cierto, ya que hay muchas falsedades que los programadores creen sobre el tiempo .
krillgar
¿Alguien podría dar un ejemplo de cuándo esto no funcionará?
slayernoah
@slayernoah Dependiendo de la configuración de localización del servidor, creo que esto a veces generará un error.
Jamie F
3

Para obtener el primer y último día del año, se puede utilizar la CONCATfunción. El valor resultante se puede convertir a cualquier tipo.

CONCAT(YEAR(Getdate()),'-01-01') FirstOfYear,
CONCAT(YEAR(GETDATE()),'-12-31') LastOfYear
Gayle
fuente
El año no funciona para mí pero date_part funciona start_year_date: = CONCAT (date_part ('Y', start_date_p) :: int :: text, '- 01-01') :: date;
bormat
1

Para la fecha de inicio del año actual:

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

Para la fecha de finalización del año actual:

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

Otra forma: (desde SQL Server 2012)

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

Mira este:

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
Nunca sin esperanza
fuente
0
SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())
DHANA LAKSHMI
fuente
0
print Cast('1/1/' + cast(datepart(yyyy, getdate()) as nvarchar(4)) as date)
zadeveloper
fuente
Deberías explicar tu código. Los volcados de código a menudo se votan negativamente y pueden eliminarse.
Errores
0

Parece que está interesado en realizar una operación todo para un año determinado, si este es el caso, recomendaría usar la función YEAR () de esta manera:

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

Lo mismo ocurre con DAY () y MONTH () . También están disponibles para las variantes de MySQL / MariaDB y se introdujeron en SQL Server 2008 (por lo que no para el 2000 específico).

chjortlund
fuente
-1
select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31') 
from dual
R-Dubz
fuente
Esto es para PL-SQL, la publicación dice SQL Server 2000, por lo que debe usar T-SQL. To_Date y Sysdate no existen en T-SQL
Andrew Failor
-1

En Microsoft SQL Server (T-SQL) esto se puede hacer de la siguiente manera

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

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

FECHA Y HORA ACTUAL : devuelve la fecha del servidor SQL en el momento de la ejecución de la consulta.

AÑO : obtiene la parte del año de la marca de tiempo actual.

STR , LTRIM : estas dos funciones se aplican para que podamos convertir esto en un varchar que se pueda concatinar con nuestro prefijo deseado (en este caso, es la primera fecha del año o la última fecha del año). Por alguna razón, el resultado generado por la función YEAR tiene espacios de prefijo. Para solucionarlos usamos la función LTRIM que se deja recortar.

Soundararajan
fuente
-1

Si llega al 1 de enero, es posible que aún sea la fecha del último año.

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
Nathan Lincoln
fuente
-2

Prueba esto:

DATE_FORMAT(NOW(),'01/01/%Y')
DATE_FORMAT(NOW(),'31/12/%Y')
Iván
fuente
Microsoft SQL Server. Msg 195, Level 15, State 10, Line 1 'NOW' is not a recognized function name.
jumxozizi
Esta respuesta usa funciones MySQL (y envía fechas a cadenas, que es una de mis cosas que me molestan).
Álvaro González
-3

--- Demos de Lalmuni ---

create table Users
(
userid int,date_of_birth date
)

--- insertar 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
Lalmuni Singh
fuente