Tôi muốn liệt kê tất cả doanh số, và nhóm tổng số theo ngày.
Sales (saleID INT, amount INT, created DATETIME)
Cập nhật Tôi đang sử dụng SQL Server 2005
Tôi muốn liệt kê tất cả doanh số, và nhóm tổng số theo ngày.
Sales (saleID INT, amount INT, created DATETIME)
Cập nhật Tôi đang sử dụng SQL Server 2005
Câu trả lời:
nếu bạn đang sử dụng SQL Server,
dateadd(DAY,0, datediff(day,0, created))
sẽ trả lại ngày đã tạo
ví dụ: nếu việc bán hàng được tạo vào ' dateadd(DAY,0, datediff(day,0, created))
2009-11 / 02 06: 12: 55.000', hãy
trả lại '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))
Đối với máy chủ SQL:
GROUP BY datepart(year,datefield),
datepart(month,datefield),
datepart(day,datefield)
hoặc nhanh hơn (từ Q8-Coder):
GROUP BY dateadd(DAY,0, datediff(day,0, created))
Đối với MySQL:
GROUP BY year(datefield), month(datefield), day(datefield)
hoặc tốt hơn (từ Jon Bright):
GROUP BY date(datefield)
Đối với Oracle:
GROUP BY to_char(datefield, 'yyyy-mm-dd')
hoặc nhanh hơn (từ IronGaggery):
GROUP BY trunc(created);
Đối với Informix (của Jonathan Leffler):
GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)
Nếu bạn đang sử dụng MySQL:
SELECT
DATE(created) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
saledate
Nếu bạn đang sử dụng MS SQL 2008:
SELECT
CAST(created AS date) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
CAST(created AS date)
thực tế điều này phụ thuộc vào DBMS bạn đang sử dụng nhưng trong SQL thông thường convert(varchar,DateColumn,101)
sẽ thay đổi định dạng DATETIME thành ngày (một ngày)
vì thế:
SELECT
sum(amount)
FROM
sales
GROUP BY
convert(varchar,created,101)
số magix 101
là định dạng ngày được chuyển đổi thành
Nếu bạn đang sử dụng SQL Server, bạn có thể thêm ba trường được tính vào bảng của mình:
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
và bây giờ bạn có thể dễ dàng nhóm theo, đặt hàng theo vv theo ngày, tháng hoặc năm bán hàng:
SELECT SaleDay, SUM(Amount)
FROM dbo.Sales
GROUP BY SaleDay
Các trường được tính toán đó sẽ luôn được cập nhật (khi ngày "Đã tạo" của bạn thay đổi), chúng là một phần của bảng của bạn, chúng có thể được sử dụng giống như các trường thông thường và thậm chí có thể được lập chỉ mục (nếu chúng được "BỊ" ) - tính năng tuyệt vời mà hoàn toàn không được sử dụng, IMHO.
Marc
Đối với nhà tiên tri bạn có thể
group by trunc(created);
vì điều này cắt thời gian được tạo ra vào nửa đêm trước.
Một lựa chọn khác là
group by to_char(created, 'DD.MM.YYYY');
đạt được kết quả tương tự, nhưng có thể chậm hơn vì nó yêu cầu chuyển đổi loại.
Đối với PostgreSQL:
GROUP BY to_char(timestampfield, 'yyyy-mm-dd')
hoặc sử dụng diễn viên:
GROUP BY timestampfield::date
nếu bạn muốn tốc độ, sử dụng tùy chọn thứ hai và thêm chỉ mục:
CREATE INDEX tablename_timestampfield_date_idx ON tablename(date(timestampfield));
sử dụng 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)
}