Comment obtenir la première et la dernière date de l'année en cours?


110

À l'aide de SQL Server 2000, comment puis-je obtenir la première et la dernière date de l'année en cours?

Production attendue:

01/01/2012 et 31/12/2012

Réponses:


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

La requête ci-dessus donne une valeur datetime pour minuit au début du 31 décembre. C'est environ 24 heures avant le dernier moment de l'année. Si vous souhaitez inclure le temps qui pourrait se produire le 31 décembre, comparez-le au premier de l'année suivante, avec une <comparaison. Ou vous pouvez comparer aux dernières millisecondes de l'année en cours, mais cela laisse toujours un espace si vous utilisez autre chose que DATETIME (tel que 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

Détails techniques

Cela fonctionne en calculant le nombre d'années depuis 1900 avec DATEDIFF(yy, 0, GETDATE()), puis en l'ajoutant à une date de zéro = 1 janvier 1900. Cela peut être changé pour fonctionner pour une date arbitraire en remplaçant la GETDATE()partie ou une année arbitraire en remplaçant la DATEDIFF(...)fonction par "Année - 1900."

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

13

Voici un moyen assez simple;

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

Ce n'est pas sexy, mais ça marche.


1
Uniquement disponible à partir de Sql Server 2012.
Lukas

12

Vous pouvez obtenir l'année en cours en utilisant la DATEPARTfonction, à partir de la date actuelle obtenue en utilisantgetUTCDate()

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

1
Cela génère des chaînes, pas des dates. Si c'est ce dont vous avez vraiment besoin, oui, mais si vous pouvez utiliser l'un ou l'autre, conservez les dates sous forme de dates et ne les utilisez pas comme chaînes.
Jamie F

2
Je ne suis pas d'accord, OP n'a pas spécifié et le formulaire de données défini dans le serveur SQL peut renvoyer quelque chose comme '2012-01-01 12:13:14' au lieu de '01 /
01/2012

1
@RandyMorris, d'accord, l'OP demandait s'il pouvait obtenir à la DATETIMEplace de la chaîne et évidemment cela pourrait ne pas correspondre à la sortie attendue selon la question.
Vikdor

1
Pourquoi utiliseriez-vous un format de date ambigu (et les chaînes de votre réponse ne correspondent pas au format de votre commentaire)? yyyyMMddest sans ambiguïté.
Damien_The_Unbeliever

1
@Damien_The_Unbeliever, la requête dans la réponse doit correspondre à la sortie attendue selon la question. Le commentaire sur DATETIME est une réponse au commentaire d'OP sur l'obtention de la date au lieu de la chaîne. La réponse ne reflète pas cette discussion.
Vikdor

7

écrivez simplement: -

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

date de début de l'année.

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

4

Chaque année a le 1 er comme première date et le 31 comme dernière date, ce que vous devez faire est de ne rattacher l'année qu'à ce jour et ce mois par exemple: -

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

1
Ce n'est pas nécessairement vrai, car il existe de nombreux mensonges que les programmeurs croient à propos du temps .
krillgar

Quelqu'un pourrait-il donner un exemple de cas où cela ne fonctionnera pas?
slayernoah

@slayernoah En fonction des paramètres de localisation du serveur, je pense que cela générera parfois une erreur.
Jamie F

3

Pour obtenir le premier et le dernier jour de l'année, on peut utiliser la CONCATfonction. La valeur résultante peut être convertie en n'importe quel type.

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

Year ne fonctionne pas pour moi mais date_part fonctionne start_year_date: = CONCAT (date_part ('Y', start_date_p) :: int :: text, '- 01-01') :: date;
bormat

1

Pour la date de début de l'année en cours:

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

Pour la date de fin de l'année en cours:

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

1

Une autre façon: (depuis SQL Server 2012)

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

0

Découvrez celui-ci:

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)

Vous devez expliquer votre code. Les vidages de code sont souvent rejetés et peuvent être supprimés.
Bugs

0

Il semble que vous soyez intéressé à effectuer une opération sur tout pour une année donnée, si c'est effectivement le cas, je recommanderais d'utiliser la fonction YEAR () comme ceci:

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

Il en va de même pour DAY () et MONTH () . Ils sont également disponibles pour les variantes MySQL / MariaDB et ont été introduits dans SQL Server 2008 (donc pas pour 2000 spécifiques).


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

Ceci est pour PL-SQL, post dit SQL Server 2000, vous devez donc utiliser T-SQL. To_Date et Sysdate n'existent pas dans T-SQL
Andrew Failor

-1

Dans Microsoft SQL Server (T-SQL), cela peut être fait comme suit

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

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

CURRENT_TIMESTAMP - renvoie la date du serveur SQL au moment de l'exécution de la requête.

ANNÉE - obtient la partie année de l'horodatage actuel.

STR , LTRIM - ces deux fonctions sont appliquées afin que nous puissions le convertir en un varchar qui peut être concaténé avec le préfixe souhaité (dans ce cas, il s'agit soit de la première date de l'année, soit de la dernière date de l'année). Pour une raison quelconque, le résultat généré par la fonction YEAR a des espaces de préfixe. Pour les corriger, nous utilisons la fonction LTRIM qui est à gauche.


-1

S'il atteint le 1er janvier, il se peut que ce soit encore la date des dernières années.

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

Essaye ça:

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

Cette réponse utilise des fonctions MySQL (et convertit les dates en chaînes, ce qui est l'un de mes favoris).
Álvaro González

-3

--- Démos Lalmuni ---

create table Users
(
userid int,date_of_birth date
)

--- insérer des valeurs ---

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.