Saya ingin mendaftar semua penjualan, dan mengelompokkan jumlah berdasarkan hari.
Sales (saleID INT, amount INT, created DATETIME)
Pembaruan Saya menggunakan SQL Server 2005
Saya ingin mendaftar semua penjualan, dan mengelompokkan jumlah berdasarkan hari.
Sales (saleID INT, amount INT, created DATETIME)
Pembaruan Saya menggunakan SQL Server 2005
Jawaban:
jika Anda menggunakan SQL Server,
dateadd(DAY,0, datediff(day,0, created))
akan mengembalikan hari yang dibuat
misalnya, jika penjualan dibuat pada '2009-11-02 06: 12: 55.000',
dateadd(DAY,0, datediff(day,0, created))
kembalikan '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))
Untuk SQL Server:
GROUP BY datepart(year,datefield),
datepart(month,datefield),
datepart(day,datefield)
atau lebih cepat (dari Q8-Coder):
GROUP BY dateadd(DAY,0, datediff(day,0, created))
Untuk MySQL:
GROUP BY year(datefield), month(datefield), day(datefield)
atau lebih baik (dari Jon Bright):
GROUP BY date(datefield)
Untuk Oracle:
GROUP BY to_char(datefield, 'yyyy-mm-dd')
atau lebih cepat (dari IronGoofy):
GROUP BY trunc(created);
For Informix (oleh Jonathan Leffler):
GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)
Jika Anda menggunakan MySQL:
SELECT
DATE(created) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
saledate
Jika Anda menggunakan MS SQL 2008:
SELECT
CAST(created AS date) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
CAST(created AS date)
sebenarnya ini tergantung pada DBMS apa yang Anda gunakan tetapi dalam SQL biasa convert(varchar,DateColumn,101)
akan mengubah format DATETIME ke tanggal (satu hari)
begitu:
SELECT
sum(amount)
FROM
sales
GROUP BY
convert(varchar,created,101)
angka magix 101
adalah format tanggal yang diubahnya
Jika Anda menggunakan SQL Server, Anda bisa menambahkan tiga bidang terhitung ke tabel Anda:
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
dan sekarang Anda dapat dengan mudah mengelompokkan berdasarkan, memesan berdasarkan dll. berdasarkan hari, bulan atau tahun penjualan:
SELECT SaleDay, SUM(Amount)
FROM dbo.Sales
GROUP BY SaleDay
Bidang-bidang yang dihitung akan selalu tetap terbaru (ketika tanggal "Dibuat" Anda berubah), mereka adalah bagian dari tabel Anda, bidang tersebut dapat digunakan seperti bidang biasa, dan bahkan dapat diindeks (jika "TERTENTU" ) - fitur hebat yang benar-benar kurang dimanfaatkan, IMHO.
Marc
Untuk oracle kamu bisa
group by trunc(created);
karena ini memotong datetime yang dibuat ke tengah malam sebelumnya.
Pilihan lain adalah
group by to_char(created, 'DD.MM.YYYY');
yang mencapai hasil yang sama, tetapi mungkin lebih lambat karena memerlukan konversi jenis.
Untuk PostgreSQL:
GROUP BY to_char(timestampfield, 'yyyy-mm-dd')
atau menggunakan gips:
GROUP BY timestampfield::date
jika Anda ingin kecepatan, gunakan opsi kedua dan tambahkan indeks:
CREATE INDEX tablename_timestampfield_date_idx ON tablename(date(timestampfield));
gunakan LINQ
from c in Customers
group c by DbFunctions.TruncateTime(c.CreateTime) into date
orderby date.Key descending
select new
{
Value = date.Count().ToString(),
Name = date.Key.ToString().Substring(0, 10)
}