2015-05-13 23 views
6

Tôi có công thức sau:SQL: Tổng số ngày trong một tháng

"Value1" * 100 * "Total day in a month" * "Value2" 

Tôi có bảng sau:

ID  Date  Time  Value1  Value2 
1  2014-01-01 00:00 10   20 
2  2014-01-01 01:00 20   5 

Tôi muốn chọn một dữ liệu trong một năm với chỉ sử dụng một tham số là Year.
Làm cách nào để áp dụng công thức vào truy vấn?

Kết quả sẽ là:

ID  Date  Time  Value1  Value2 TotalDayinMonth Result 
1  2014-01-01 00:00 10   20  31    620000 
2  2014-01-01 01:00 20   5  31    310000 
ff. 
+0

Xin lỗi tôi không hiểu. Bạn có thể cung cấp thêm chi tiết và làm việc thông qua một vài hàng đầu ra mà bạn đang mong đợi? –

+0

Vì vậy, trên hàng 1 có ngày 2014-01-01, Tổng cộng trong một tháng = 31? –

+0

Có, tôi chỉ chỉnh sửa câu hỏi. Vì vậy, nó sẽ tính toán tổng số ngày trong mỗi tháng. Jan = 31. Feb = 28. Mar = 31. Tùy thuộc vào số ngày trong tháng. – Haminteu

Trả lời

4

Bạn có thể lấy số ngày của một ngày nhất định như thế này:

DECLARE @date DATETIME = '2014-01-01' 
SELECT DATEDIFF(DAY, @date, DATEADD(MONTH, 1, @date)) 

Và truy vấn:

SELECT ID 
     ,[Date] 
     ,[Time] 
     ,Value1 
     ,Value2 
     ,DATEDIFF(DAY, [Date], DATEADD(MONTH, 1, [Date])) AS TotalDayinMonth 
     ,Value1 * 100 * DATEDIFF(DAY, [Date], DATEADD(MONTH, 1, [Date])) * Value2 AS Result 
FROM yourTable 
+1

Biểu thức này phụ thuộc vào ngày không đến cuối tháng dài - ví dụ: nếu '@ date' là' 2014-01-31', chúng tôi phát hiện ra rằng tháng 1 dài 28 ngày. –

1

biểu này sẽ cung cấp cho bạn số ngày trong tháng mà date là bất kể ngày nào là ngày:

datediff(day, 
    dateadd(month,datediff(month, 0, date),0), 
    dateadd(month,datediff(month, 0, date)+1,0)) 
1

Kiểm tra câu trả lời này. Bạn có thể sử dụng EOMONTHDAY chức năng của SQL để có được số ngày trong một tháng.

SELECT ID 
     ,[Date] 
     ,[Time] 
     ,Value1 
     ,Value2 
     ,DAY(EOMONTH(Date)) AS TotalDaysInMonth 
     ,Value1 * 100 * DAY(EOMONTH(Date)) * Value2 AS Result 
FROM TABLENAME 
+2

Không có 'EOMONTH() 'hàm trong SQL Server 2008 – sqluser

+0

NGÀY (EOMONTH (Ngày)) là một lựa chọn tốt cho những người trên SQL Sever 2012 hoặc cao hơn – Jeff

0

bạn cũng có thể kiểm tra điều này.

declare @t table (ID int, Date date, Time time, Value1 int, Value2 int) 

insert into @t values (1,'2014-01-01','00:00',10,20) , (2,'2014-01-01','00:00',20,5), (3,'2014-02-01','00:00',20,5) 

select * from @t 

; with cte as 
(
    select id, 
     day(DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,DATE)+1,0))) Totaldayofmonth  
    from @t 
) 
--select * from cte 
select 
    *, Value1 * 100 * Totaldayofmonth * Value2 
from 
    @t t inner join cte on cte.ID = t.id 
Các vấn đề liên quan