 |
รบกวนช่วยดู SQL ให้หน่อยคะ แสดงผลไม่ถูกคะถ้าแทนด้วยฟิลด์ในตาราง ลองแทนค่าลงไปตรงผลกลับออกมาถูกคะ ทั้งๆที่เหมือนกันทุกอย่าง ต่างแค่ตรงที่แทนค่า |
|
 |
|
|
 |
 |
|
รบกวนช่วยดู SQL ให้หน่อยคะ
ค่าแสดงออกมาไม่ตรงคะ
Code
select personnel.personnel_id, personnel.reg_job, member.vacation_max
,DATEDIFF(year,(year(personnel.reg_job)),(year(GETDATE())+'543')) as years
,DATEDIFF(year,(year(2554-01-02)),(year(GETDATE())+'543')) as years1
,month(CONVERT(VARCHAR(24),personnel.reg_job,105)) as monthStartJob
from member,personnel
where member.id_card=personnel.id_card
and personnel.personnel_id = '5500987'
ผลออกมาเป็นแบบนี้คะ

ทั้งๆที่ค่า personnel.reg_job ก็เท่ากับ 2554-01-02 นะคะ
แต่ทำไมผลที่ออกมาถึงไม่ตรงกันคะ ซึ่งค่า years ต้องเท่ากับ 2 คะ
รบกวนด้วยคะ
Tag : PHP, Ms SQL Server 2005, Ms SQL Server 2008
|
|
 |
 |
 |
 |
Date :
2013-02-12 16:20:41 |
By :
Baitong_ch |
View :
2458 |
Reply :
21 |
|
 |
 |
 |
 |
|
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
นึกว่าใครซะอีก ... สบายดีเหรอครับ
|
 |
 |
 |
 |
Date :
2013-02-12 16:40:20 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ไล่ วงเล็บดูดีๆ ครับ มันมีที่ผิดอยู่นาาาา
แก้ให้แล้ว ลองเอาไปทดสอบดูหน่อยว่าผ่านมั๊ย
Quote:select personnel.personnel_id, personnel.reg_job, member.vacation_max
,DATEDIFF(year(personnel.reg_job),( year(GETDATE())+'543') ) as years
,DATEDIFF(year(2554-01-02), ( year(GETDATE())+'543') ) as years1
,month(CONVERT(VARCHAR(24),personnel.reg_job,105)) as monthStartJob
from member,personnel
where member.id_card=personnel.id_card
and personnel.personnel_id = '5500987'
|
 |
 |
 |
 |
Date :
2013-02-12 16:49:32 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แสดงว่าพี่เข้าใจ datediff ผิดไป เดี๋ยวดูให้ใหม่
|
 |
 |
 |
 |
Date :
2013-02-12 16:54:28 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ใช้ฐานข้อมูลตัวไหนอยู่ Oracle หรอ??
|
 |
 |
 |
 |
Date :
2013-02-12 17:01:20 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Quote:งั้นก็แบบนี้
select personnel.personnel_id, personnel.reg_job, member.vacation_max
,DATEDIFF(yyyy, year(personnel.reg_job),( year(GETDATE())+'543') ) as years
,DATEDIFF(yyyy, year(2554-01-02), ( year(GETDATE())+'543') ) as years1
,month(CONVERT(VARCHAR(24),personnel.reg_job,105)) as monthStartJob
from member,personnel
where member.id_card=personnel.id_card
and personnel.personnel_id = '5500987'
ใช้ yyyy แทน year ก็ดีจะได้ไม่งง
|
 |
 |
 |
 |
Date :
2013-02-12 17:05:38 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ก็ยังแสดงไม่ถูกอยู่ดีคะพี่

|
 |
 |
 |
 |
Date :
2013-02-12 17:08:08 |
By :
Baitong_ch |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แต่พี่ชอบแบบนี้มากกว่า ,(year(GETDATE())+'543') - (year(reg_job)) as years ซึ่งน่าจะเร็วกว่าด้วย
เพราะไม่ต้องเรียกใช้ฟังก์ชั่นหลายตัว
|
 |
 |
 |
 |
Date :
2013-02-12 17:08:30 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองเอาอันนี้ไปทดสอบซิ
select datediff(yyyy , dateadd(year, 543 ,curdate( )) , '2554-01-02')
แต่ถ้าเป็น mysql จะใช้แบบนี้
select floor(datediff(date_add(curdate( ) ,interval 543 year) , '2554-01-02') / 365)
|
ประวัติการแก้ไข 2013-02-12 17:24:23
 |
 |
 |
 |
Date :
2013-02-12 17:21:29 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ท้ายที่สุดก็ลองอันนี้
Quote:select personnel.personnel_id, personnel.reg_job, member.vacation_max
,DATEDIFF(yyyy , dateadd(year, 543 ,curdate( )) ,personnel.reg_job) as years
,DATEDIFF(yyyy , year(2554-01-02) , ( year(GETDATE())+'543') ) as years1
,month(CONVERT(VARCHAR(24),personnel.reg_job,105)) as monthStartJob
from member,personnel
where member.id_card=personnel.id_card
and personnel.personnel_id = '5500987'
|
 |
 |
 |
 |
Date :
2013-02-12 17:30:25 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองเปลี่ยน curdate() เป็น getdate() ดูครับ
select personnel.personnel_id, personnel.reg_job, member.vacation_max
,DATEDIFF(yyyy , dateadd(year, 543 ,GETDATE()) ,personnel.reg_job) as years
,DATEDIFF(yyyy , year(2554-01-02) , ( year(GETDATE())+'543') ) as years1
,month(CONVERT(VARCHAR(24),personnel.reg_job,105)) as monthStartJob
from member,personnel
where member.id_card=personnel.id_card
and personnel.personnel_id = '5500987'
|
 |
 |
 |
 |
Date :
2013-02-13 09:46:19 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 16 เขียนโดย : sakuraei เมื่อวันที่ 2013-02-13 09:46:19
รายละเอียดของการตอบ ::
ได้แล้วคะพี่ ^^
สลับตำแหน่งกันนิดหน่อย ค่าไม่ติดลบแล้ว ใช้งานได้เลย
Code
select personnel.personnel_id, personnel.reg_job, member.vacation_max
,DATEDIFF(yyyy , personnel.reg_job , dateadd(year, 543 ,GETDATE()) ) as years
,DATEDIFF(yyyy , year(2554-01-02) , ( year(GETDATE())+'543') ) as years1
,month(CONVERT(VARCHAR(24),personnel.reg_job,105)) as monthStartJob
from member,personnel
where member.id_card=personnel.id_card
and personnel.personnel_id = '5500987'
ขอบคุณพี่มากๆๆๆๆคะ ^_____^
|
 |
 |
 |
 |
Date :
2013-02-13 09:53:00 |
By :
Baitong_ch |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
  
|
 |
 |
 |
 |
Date :
2013-02-13 09:54:40 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เพราะ datediff ต้องใช้ parameter เป็น วันที่แบบเต็มครับ '2012-12-31' ครับ เอามาแต่ ปี ไม่ได้ '2012' '2554'
ลอง select dateadd(year, 543 ,GETDATE()) ดูครับ เราก็จะได้เป็นวันที่ปัจจุบันที่เป็นปีไทย
แล้วนำไปใส่ใน datediff(yyyy , personnel.reg_job , dateadd(year, 543 ,GETDATE()) )
สังเกตดูดีๆน่ะครับว่า personnel.reg_job มีค่าเป็นวันที่แบบเต็มรูป '2554-01-02' ส่วน dateadd(year, 543 ,GETDATE())
เป็น '2556-02-13' สรุปว่า
datediff(yyyy , personnel.reg_job , dateadd(year, 543 ,GETDATE()) ) มีค่าเท่ากับ datediff(yyyy , '2554-01-02' , '2556-02-13' )

|
 |
 |
 |
 |
Date :
2013-02-13 10:04:32 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ใช้วันที่แบบเต็มรูปดีกว่าครับ ตอนกลับมาแก้ไขโค้ดจะง่ายกว่าครับ
แต่น้องตองก็ ใช้โค้ดแบบนี้ได้นี่นา สงสัยพี่จะอ่านคู่มือไม่ลเอียด DATEDIFF(yyyy , year(2554-01-02) , ( year(GETDATE())+'543') ) as years1
|
ประวัติการแก้ไข 2013-02-13 10:11:19
 |
 |
 |
 |
Date :
2013-02-13 10:07:42 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|