sql-server ältestes - Sql Abfrage nach Tag gruppieren





nächstes datum (8)


Für Orakel können Sie

group by trunc(created);

Das verkürzt die erstellte Datetime auf die vorherige Mitternacht.

Eine andere Möglichkeit ist es

group by to_char(created, 'DD.MM.YYYY');

Dies führt zu demselben Ergebnis, kann jedoch langsamer sein, da eine Typumwandlung erforderlich ist.

Ich möchte alle Verkäufe auflisten und die Summe nach Tagen gruppieren.

Sales (saleID INT, amount INT, created DATETIME)

Update Ich verwende SQL Server 2005




Dies hängt davon ab, welches DBMS Sie verwenden, aber in regulären SQL- convert(varchar,DateColumn,101) wird das DATETIME-Format auf ein Datum (ein Tag) geändert.

damit:

SELECT 
    sum(amount) 
FROM 
    sales 
GROUP BY 
    convert(varchar,created,101)

Die Magix-Nummer 101 ist das Datumsformat, in das sie konvertiert wird




Wenn Sie SQL Server verwenden, können Sie drei berechnete Felder zu Ihrer Tabelle hinzufügen:

Sales (saleID INT, amount INT, created DATETIME)

ALTER TABLE dbo.Sales
  ADD SaleYear AS YEAR(Created) PERSISTED
ALTER TABLE dbo.Sales
  ADD SaleMonth AS MONTH(Created) PERSISTED
ALTER TABLE dbo.Sales
  ADD SaleDay AS DAY(Created) PERSISTED

und jetzt können Sie einfach nach Tag, Monat oder Jahr des Verkaufs gruppieren, bestellen usw.

SELECT SaleDay, SUM(Amount)
FROM dbo.Sales
GROUP BY SaleDay

Diese berechneten Felder werden immer auf dem neuesten Stand gehalten (wenn sich das "Erstellungsdatum" ändert), sie sind Teil Ihrer Tabelle, sie können wie normale Felder verwendet werden und können sogar indiziert werden (wenn sie "PERSISTED" sind) ) - Tolles Feature, das völlig unzureichend genutzt wird, IMHO.

Marc




Für PostgreSQL:

GROUP BY to_char(timestampfield, 'yyyy-mm-dd')

oder mit Cast:

GROUP BY timestampfield::date

Wenn Sie Geschwindigkeit wünschen, verwenden Sie die zweite Option und fügen Sie einen Index hinzu:

CREATE INDEX tablename_timestampfield_date_idx ON  tablename(date(timestampfield));



Wenn Sie SQL Server verwenden,

dateadd(DAY,0, datediff(day,0, created)) gibt den erstellten Tag zurück

Beispiel: Wenn der Verkauf am '2009-11-02 06: 12: 55.000', dateadd(DAY,0, datediff(day,0, created)) zurückgegeben '2009-11-02 00: 00: 00.000'

select sum(amount) as total, dateadd(DAY,0, datediff(day,0, created)) as created
from sales
group by dateadd(DAY,0, datediff(day,0, created))



Wenn Sie MySQL verwenden:

SELECT
    DATE(created) AS saledate,
    SUM(amount)
FROM
    Sales
GROUP BY
    saledate

Wenn Sie MS SQL 2008 verwenden:

SELECT
    CAST(created AS date) AS saledate,
    SUM(amount)
FROM
    Sales
GROUP BY
    CAST(created AS date)



Für SQL Server:

GROUP BY datepart(year,datefield), 
    datepart(month,datefield), 
    datepart(day,datefield)

oder schneller (von Q8-Coder):

GROUP BY dateadd(DAY,0, datediff(day,0, created))

Für MySQL:

GROUP BY year(datefield), month(datefield), day(datefield)

oder besser (von Jon Bright):

GROUP BY date(datefield)

Für Oracle:

GROUP BY to_char(datefield, 'yyyy-mm-dd')

oder schneller (von IronGoofy):

GROUP BY trunc(created);

Für Informix (von Jonathan Leffler):

GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)



In meinem Fall hatte ich Schwierigkeiten mit den geposteten Antworten. Ich habe am Ende folgendes benutzt:

ALTER TABLE table_name CHANGE COLUMN column_name column_name VARCHAR(200) NOT NULL DEFAULT '';

Ändern Sie VARCHAR(200) in Ihren Datentyp und ändern Sie optional den Standardwert.

Wenn Sie keinen Standardwert haben, haben Sie ein Problem mit dieser Änderung, da standardmäßig kein Konflikt erzeugt wird.





sql sql-server sql-server-2005 group-by