Wie erhalte ich das erste und letzte Datum des laufenden Jahres?


110

Wie kann ich mit SQL Server 2000 das erste und letzte Datum des aktuellen Jahres abrufen?

Erwartete Ausgabe:

01/01/2012 und 31/12/2012

Antworten:


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

Die obige Abfrage gibt einen Datum / Uhrzeit-Wert für Mitternacht Anfang Dezember 31 an. Dies ist ungefähr 24 Stunden vor dem letzten Moment des Jahres. Wenn Sie die Zeit einbeziehen möchten, die möglicherweise am 31. Dezember auftritt, sollten Sie mit einem <Vergleich mit dem ersten des nächsten Jahres vergleichen. Oder Sie können mit den letzten Millisekunden des laufenden Jahres vergleichen, aber dies lässt immer noch eine Lücke, wenn Sie etwas anderes als DATETIME (wie DATETIME2) verwenden:

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

Technische Details

Dies funktioniert, indem die Anzahl der Jahre seit 1900 mit ermittelt DATEDIFF(yy, 0, GETDATE())und dann zu einem Datum von Null = 1. Januar 1900 addiert wird. Dies kann geändert werden, um für ein beliebiges Datum zu arbeiten, indem der GETDATE()Teil oder ein beliebiges Jahr durch Ersetzen der DATEDIFF(...)Funktion durch ersetzt wird "Jahr - 1900."

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

13

Hier ist ein ziemlich einfacher Weg;

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

Es ist nicht sexy, aber es funktioniert.


1
Nur verfügbar ab SQL Server 2012.
Lukas

12

Sie können das aktuelle Jahr mit der DATEPARTFunktion ab dem aktuellen Datum abrufen, das Sie mit erhalten habengetUTCDate()

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

1
Dies gibt Zeichenfolgen aus, keine Datumsangaben. Wenn es das ist, was Sie wirklich brauchen, yay, aber wenn Sie beides verwenden können, behalten Sie die Daten als Daten bei und verwenden Sie sie nicht als Zeichenfolgen.
Jamie F

2
Ich bin nicht einverstanden, OP hat nicht angegeben und das im SQL Server festgelegte Datenformat könnte etwas wie "2012-01-01 12:13:14" anstelle von "
01/01/2012

1
@RandyMorris, stimme zu, das OP hat gefragt, ob er DATETIMEanstelle eines Strings bekommen kann und offensichtlich stimmt das möglicherweise nicht mit der erwarteten Ausgabe gemäß der Frage überein.
Vikdor

1
Warum sollten Sie ein mehrdeutiges Datumsformat verwenden (und die Zeichenfolgen in Ihrer Antwort stimmen nicht mit dem Format in Ihrem Kommentar überein)? yyyyMMddist eindeutig.
Damien_The_Unbeliever

1
@Damien_The_Unbeliever, die Abfrage in der Antwort soll mit der erwarteten Ausgabe gemäß der Frage übereinstimmen. Der Kommentar zu DATETIME ist eine Antwort auf den Kommentar von OP zum Abrufen des Datums anstelle einer Zeichenfolge. Die Antwort spiegelt diese Diskussion nicht wider.
Vikdor

7

schreibe einfach: -

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

Startdatum des Jahres.

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

4

Jedes Jahr hat das 1. als erstes Datum und das 31. als letztes Datum. Sie müssen nur das Jahr an diesen Tag und Monat anhängen, zum Beispiel: -

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

1
Dies ist nicht unbedingt wahr, da es viele Unwahrheiten gibt, an die Programmierer über die Zeit glauben .
Krillgar

Könnte jemand ein Beispiel geben, wann dies nicht funktioniert?
Slayernoah

@slayernoah Abhängig von den Lokalisierungseinstellungen des Servers wird dies manchmal zu einem Fehler führen.
Jamie F

3

Um den ersten und den letzten Tag des Jahres zu erhalten, kann man die CONCATFunktion verwenden. Der resultierende Wert kann in einen beliebigen Typ umgewandelt werden.

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

Das Jahr funktioniert bei mir nicht, aber date_part funktioniert start_year_date: = CONCAT (date_part ('Y', start_date_p) :: int :: text, '- 01-01') :: date;
Bormat

1

Zum Startdatum des laufenden Jahres:

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

Für das Enddatum des laufenden Jahres:

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

1

Ein anderer Weg: (seit SQL Server 2012)

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

0

Schauen Sie sich dieses an:

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)

Sie sollten Ihren Code erklären. Code-Dumps werden häufig herabgestuft und können gelöscht werden.
Bugs

0

Es sieht so aus, als ob Sie daran interessiert sind, eine Operation für ein bestimmtes Jahr durchzuführen. Wenn dies tatsächlich der Fall ist, würde ich empfehlen, die Funktion YEAR () wie folgt zu verwenden :

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

Gleiches gilt für DAY () und MONTH () . Sie sind auch für MySQL / MariaDB-Varianten verfügbar und wurden in SQL Server 2008 eingeführt (also nicht für bestimmte 2000).


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

Dies ist für PL-SQL, heißt es in SQL Server 2000, daher müssen Sie T-SQL verwenden. To_Date und Sysdate existieren nicht in T-SQL
Andrew Failor

-1

In Microsoft SQL Server (T-SQL) kann dies wie folgt erfolgen

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

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

CURRENT_TIMESTAMP - Gibt das SQL Server-Datum zum Zeitpunkt der Ausführung der Abfrage zurück.

JAHR - Ruft den Jahresteil des aktuellen Zeitstempels ab.

STR , LTRIM - Diese beiden Funktionen werden angewendet, damit wir sie in einen Varchar umwandeln können, der mit unserem gewünschten Präfix verknüpft werden kann (in diesem Fall ist es entweder das erste Datum des Jahres oder das letzte Datum des Jahres). Aus irgendeinem Grund hat das von der YEAR- Funktion generierte Ergebnis vorangestellte Leerzeichen. Um sie zu beheben, verwenden wir die LTRIM- Funktion, die links getrimmt ist.


-1

Wenn es den 1. Januar erreicht, könnte es sein, dass es noch das Datum des letzten Jahres ist.

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

Versuche dies:

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

Diese Antwort verwendet MySQL-Funktionen (und wandelt Datumsangaben in Zeichenfolgen um, was eine meiner Lieblingsbeschwerden ist).
Álvaro González

-3

--- Lalmuni Demos ---

create table Users
(
userid int,date_of_birth date
)

--- Werte einfügen ---

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.