 |
|
ขอวิธีคิดหน่อยครับ ใครรุ้ช่วยแนะนำหน่อยครับว่า การคิดเดือน จากวัน เวลา ทำงาน ของ sql server ว่าคำนวนยังไงครับ พอดีผมใช้ datediff แล้วไม่ตรงครับ |
|
 |
|
|
 |
 |
|
Code (SQL)
IF OBJECT_ID('tempdb..#Fuck') IS NOT NULL DROP TABLE #Fuck;
DECLARE @month TINYINT = MONTH(GETDATE()); -- เดือนปัจจูบัน
DECLARE @Cols NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX)
;WITH CTE_Days AS
(
SELECT DATEADD(month, @month, DATEADD(month, -MONTH(GETDATE()), DATEADD(day, -DAY(GETDATE()) + 1, CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)))) D, 1 AS RN, 0.0 AS Amt
UNION ALL
SELECT DATEADD(day, 1, D), RN + 1, 0.0
FROM CTE_Days
WHERE D < DATEADD(day, -1, DATEADD(month, 1, DATEADD(month, @month, DATEADD(month, -MONTH(GETDATE()), DATEADD(day, -DAY(GETDATE()) + 1, CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME))))))
)
SELECT * INTO #Fuck FROM CTE_Days
select @Cols = STUFF((SELECT (',' + QuoteName(RN))
FROM #Fuck Mom
GROUP BY Mom.RN
ORDER BY Mom.RN ASC --Fixed 1, 10, 11, 12, ...
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @query = 'SELECT RN,' + @cols + ' from
(
select RN, DAY(D) AS D, Amt
from #Fuck ' + '
) src
pivot
(
sum(Amt)
for [D] in (' + @cols + ')
) piv '
EXECUTE(@query);
IF OBJECT_ID('tempdb..#Fuck') IS NOT NULL DROP TABLE #Fuck;
|
 |
 |
 |
 |
Date :
2017-06-09 13:16:22 |
By :
หน้าอี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
งง ครับ อธิบายหน่อยครับ
|
 |
 |
 |
 |
Date :
2017-06-09 13:34:07 |
By :
txais |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
จาก #NO3 จริงฯแล้วมันประยุกต์ใช้กับกระทู้ที่ #127932 ได้ด้วย(ตรงฯไม่มีอ้อมค้อมด้วยซ้ำไป)
เพียงแต่ว่าพวกคุณมองออกหรือไม่?
--- ผมมองออกเป็นเพราะว่า ไอคิวของผมมีน้อย
...
...
...
|
 |
 |
 |
 |
Date :
2017-06-09 14:27:16 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมไม่ได้ตั้งใจจะว่าพวกคุณนะ แต่ผมเปรียบเปรยให้ฟัง (Advance Algorithm)
คนมีใบขับขี่ VS คนไม่มีใบขับขึ่
--- มีรถแล้วขับไม่เป็น นับว่าแย่สุดฯแล้วนะ
------ อย่างน้อยฯคิดในแง่ดี บ้านมันมีสตางค์ว่ะเฮ้ย
--- ไม่มีรถแล้วยังขับไม่เป็น นับว่ายอดแย่สุดฯ
------ อย่างน้อยฯคิดในแง่ดี มันเป็นคนดีวะเฮ้ย
...
...
...
+55555 (ผมคิดอะไรไปเรื่อยเปือย +-*/)
|
 |
 |
 |
 |
Date :
2017-06-09 14:41:59 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
จาก #NO 6
--- โปรแกรมเมอร์ 10, 100, 1,000 คน คิดเลขเร็ว/ถูกต้อง สู้แม่ค้าตลาดสดไม่ได้แม้แต่คนเดียว
(เลือกคนไหนมาก็ได้ถ้าไม่เชื่อ)
Quote:DATEDIFF( MM, @begin_date, @end_date)
--- ฟังก์ชั่น DATEDIFF(MM, , @begin_date, @end_date)
------ หาจำนวนเดือน ทั้งหมดจากวันที่-วันที่ (จากตัวอย่างได้ 70 เดือน)
ถ้าจะหาว่ามีกี่ปี
Code (SQL)
-- ปัดลงให้เป็นจำนวนเต็ม(0, 1, 2, 3, ...)
SELECT FLOOR(DATEDIFF(MM, , @begin_date, @end_date) / 12)
-- ได้ 5 ปี
ถ้าจะหาว่ามีกี่เดือน
Code (SQL)
SELECT DATEDIFF(MM, , @begin_date, @end_date) % 12
-- ได้ 10 เดือน
สรุปว่า จากวันที่ '2007-08-28' - '2013-06-07'
คำนวณได้ 5 ปี 10 เดือน
ปล. ในสถานะการณ์จริง บางเงื่อนไข(บางความต้องการ) มันมีมากกว่านี้
ทั้งนี้ทั้งนั้น ขึ้นอยู่กับการพลิกแพลง (มีกึ๋นเป็นกรณีฯไป)
|
 |
 |
 |
 |
Date :
2017-06-11 13:11:38 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แถมให้อีก จาก #NO 6 - #NO 7
--- สังเกตุว่ามันจะหายไปวันหนึ่ง ยกตัวอย่างเช่น จากวันที่ 1- ถึงวันที่ 2 = 1 วัน
------ สาเหตุมันเป็นเพราะ ความละเอียด/กึ๋น ไม่เพียงพอ "ใช้วันที่ 2007-08-28" (ขาด Offset Day)
------ Offset สิ้นวันประมาณว่า 2007-08-28 23:59:59:999
|
 |
 |
 |
 |
Date :
2017-06-11 13:18:42 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|