 |
ขอสอบถามการคิวรี่ข้อมูลในช่วงระหว่าง เวลาเริ่มต้นกับสิ้นสุดหน่อยครับ |
|
 |
|
|
 |
 |
|
ไม่ยากเลยครับ ง่ายมาก ๆ
Code (PHP)
<?
$inputStart = "2012-06-02";
$inputEnd = "2012-06-05";
$sql = "SELECT * FROM absence
WHERE (employee_id = '".$employee_id."') and
((endate BETWEEN '".$inputStart."' and '".$inputEnd."') or (endate BETWEEN '".$inputStart."' and '".$inputEnd."')) ";
?>
ใช้ OR เอาครับ ถ้ามี Record แสดงว่าไม่ว่างครับ
|
 |
 |
 |
 |
Date :
2012-06-10 13:39:51 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมว่ามันถูกแล้วน่ะครับ ลองดูตัวนี้ด้วยครับ (employee_id = '999001')
|
 |
 |
 |
 |
Date :
2012-06-10 18:43:08 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (PHP)
$sql = "SELECT * FROM absence WHERE employee_id = '".$employee_id."' and ( ('".$startDate."' BETWEEN stdate and endate) and ('".$endDate."' BETWEEN stdate and endate) ) ";
|
 |
 |
 |
 |
Date :
2012-06-10 20:20:52 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
บอกหน่อยซิครับ ว่ากำลังพยายามจะทำอะไรอยู่
อธิบายเนื้องานมาเผื่อช่วยหาทางออกอื่นๆ
|
 |
 |
 |
 |
Date :
2012-06-10 20:54:22 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองแบบนี้ดีมั๊ย
Code (PHP)
$sql = "SELECT * FROM absence WHERE employee_id = '".$employee_id."' and ( ( ('".$startDate."' BETWEEN stdate and endate) or '".$startDate."' >= endate ) and ('".$endDate."' BETWEEN stdate and endate) ) ";
|
 |
 |
 |
 |
Date :
2012-06-10 20:57:32 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
งานนะครับคือว่า
พนักงานนึงคน เข้ามาทำการลา ทีนี้พอเราทำวันลาแล้วหนึ่งครั้ง
อย่างเช่น ลาป่วย ลาตั้งแต่ 1-10 มิถุนา
ทีนี้ถ้าเกิด พนักงานจะทำการลาอย่างอื่นเช่น ลากิจ ลาป่วย ลาพักผ่อน
ก็จะต้องไม่สามารถลาภายในวันที่ระหว่าง 1-10มิถุนาได้ เนื่องจากลาป่วยไปแล้ว
|
 |
 |
 |
 |
Date :
2012-06-10 21:09:13 |
By :
phongphisut |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
พอใช้ OR แล้วมันดันไป select ค่าที่ตรงกับวันของ พนักงานคนอื่นมาแทนอะครับพี่ เหมือนมันไป select or โดด ๆ เลย
ไม่ได้ตามเลขประจำตัวอะครับ
|
ประวัติการแก้ไข 2012-06-10 21:11:16
 |
 |
 |
 |
Date :
2012-06-10 21:10:29 |
By :
phongphisut |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองลาแบบนี้ดูซิครับ
ครั้งแรก วันที่ 1/5/55 - 10/5/55
ครั้งที่สอง 8/5/55 - 15/5/55 ซึ่งจริงๆแล้วจะต้องลาไม่ได้
|
 |
 |
 |
 |
Date :
2012-06-10 21:32:57 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
คุณลองเอาฐานข้อมูลมาให้ดูหน่อยครับ
|
 |
 |
 |
 |
Date :
2012-06-10 21:32:58 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
กำลังจะแปะให้ดูพอดีเลยครับผม

|
 |
 |
 |
 |
Date :
2012-06-10 21:35:35 |
By :
phongphisut |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
คุณลอง echo $sql; มาให้ดูหน่อยครับ
|
 |
 |
 |
 |
Date :
2012-06-10 21:38:09 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณพี่ทั้งสองคนมากเลยนะครับ ^.^
code เอามาวางมันดูเหมือนจะมีช่องว่างตรงเลขประจำตัวเลย แต่ตอนวางใน sql ไม่มีนะครับผม
Code (PHP)
SELECT * FROM absence WHERE (employee_id = '999001') and ((stdate BETWEEN '2012-06-12' and '2012-06-13') or (endate BETWEEN '2012-06-12' and '2012-06-13'))
|
ประวัติการแก้ไข 2012-06-10 21:40:37
 |
 |
 |
 |
Date :
2012-06-10 21:39:29 |
By :
phongphisut |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ประเด็นอยู่ที่ว่า ถ้าใช้ and มันก็จะกำหนดช่วงเวลาที่แน่นอน
แต่ถ้าใช้ OR มันก็ได้ไม่ตรง
ผมเลยคิดว่า ใช้ and นี่แหล่ะ แต่กำหนดเงื่อนไขเพิ่มเติม ในการเช็ควันเริ่มต้น
ว่าการลาครั้งใหม่ให้สามารถไปซ้ำกับวันลา วันสุดท้ายของการลาครั้งก่อนได้
เลยขอเพิ่ม
.... employee_id = '".$employee_id."' and ( ( ('".$startDate."' BETWEEN stdate and endate) or '".$startDate."' >= endate ) and ('".$endDate."' BETWEEN stdate and endate) ) ";
|
 |
 |
 |
 |
Date :
2012-06-10 21:46:22 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตกลงได้แล้วหรือยังครับ หรือไม่ลอง Export phpMyAdmin มาให้หน่อยครับ
|
 |
 |
 |
 |
Date :
2012-06-10 21:53:45 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 23 เขียนโดย : mr.win เมื่อวันที่ 2012-06-10 21:53:45
รายละเอียดของการตอบ ::
ยังไม่ได้ครับ พี่วิน
พี่ Unidentifer ผมมีลา วันที่ 2 - 3 เมษา ผมทำการลาใหม่เป็น 3 -4 มันก็ select ไม่เจอของเก่าอยู่ครับพี่
Code (PHP)
-- phpMyAdmin SQL Dump
-- version 3.4.5
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Jun 10, 2012 at 04:51 PM
-- Server version: 5.5.16
-- PHP Version: 5.3.8
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Database: `eleave_cit`
--
-- --------------------------------------------------------
--
-- Table structure for table `absence`
--
CREATE TABLE IF NOT EXISTS `absence` (
`a_id` int(10) NOT NULL AUTO_INCREMENT,
`absence_no` varchar(10) NOT NULL,
`employee_id` varchar(10) NOT NULL,
`document_subject` varchar(500) NOT NULL,
`type_no` char(15) NOT NULL,
`stdate` date NOT NULL,
`endate` date NOT NULL,
`status` char(1) NOT NULL,
`dayno` float NOT NULL,
`entrancedate` datetime NOT NULL,
`approvedate` datetime NOT NULL,
PRIMARY KEY (`a_id`),
UNIQUE KEY `absence_no` (`absence_no`),
KEY `absence_no_2` (`absence_no`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=261 ;
--
-- Dumping data for table `absence`
--
INSERT INTO `absence` (`a_id`, `absence_no`, `employee_id`, `document_subject`, `type_no`, `stdate`, `endate`, `status`, `dayno`, `entrancedate`, `approvedate`) VALUES
(259, '55SCK303', '999001', 'test', 'SCK', '2012-04-02', '2012-04-03', 'A', 2, '2012-06-10 08:57:20', '2012-06-10 08:57:26'),
(255, '55SCK299', '999001', 'test', 'SCK', '2012-08-06', '2012-08-09', 'A', 4, '2012-06-08 10:01:23', '2012-06-08 10:01:29'),
(253, '55SCK297', '999001', 'test', 'SCK', '2012-06-05', '2012-06-06', 'A', 2, '2012-06-08 09:19:44', '2012-06-08 09:20:00'),
(252, '55PSN296', '999001', 'test', 'PSN', '2012-06-11', '2012-07-11', 'A', 23, '2012-06-08 09:17:39', '2012-06-08 09:17:46'),
(260, '55SCK304', '353734', 'test', 'SCK', '2012-04-09', '2012-04-10', 'A', 2, '2012-06-10 08:58:51', '2012-06-10 09:07:34');
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
ประวัติการแก้ไข 2012-06-10 21:56:28
 |
 |
 |
 |
Date :
2012-06-10 21:56:09 |
By :
phongphisut |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (PHP)
<?
$inputStart = "2012-06-02";
$inputEnd = "2012-06-05";
$sql = "SELECT * FROM absence
WHERE (employee_id = '".$employee_id."') and
(('".$inputStart."' BETWEEN stdate and endate) or ('".$inputEnd."' BETWEEN stdate and endate)) ";
?>
|
 |
 |
 |
 |
Date :
2012-06-10 22:03:53 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
คุณไม่ได้อ่านที่ผมบอกเหรอครับ ให้ดูวงเล็บ #13
|
 |
 |
 |
 |
Date :
2012-06-10 22:09:47 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
จะต้องดูก่อนครับ ถ้าไม่จำเป็นต้องแยก Statement ก็ไม่ต้องใส่ก็ได้ครับ แต่ถ้าไม่ใส่กรณีที่มี OR คนล่ะ Statement กัน มันก็จะเลือกข้อมูลไม่ถูกต้อง
|
 |
 |
 |
 |
Date :
2012-06-10 22:20:22 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แล้วถ้าวันลาวันแรก ไปอยู่ในช่่วงการลาของคราวก่อนล่ะครับ เช่น
ลาครั้งก่อน 1/6/55 - 6/6/55
ลาครั้งล่าสุด 5/6/55 - 10/6/55
จริงๆแล้วควรจะลาไม่ได้น่ะครับ เพราะมันไปคาบเกี่ยวกับช่วงเวลาของคราวก่อน
|
 |
 |
 |
 |
Date :
2012-06-10 22:24:06 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
นั่นซิ เอาหลักการมาคุยกันก่อนดีกว่า
เพราะการใช้ or มาเชื่อมการเช็คช่วงเวลา มันจะเจอปัญหาแบบนี้ล่ะ
พี่ก็พยายามชี้ให้เห็นมาตลอดอ่ะน่ะ
|
 |
 |
 |
 |
Date :
2012-06-10 22:28:10 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ใช่ครับ
(1/6/55 [5/6/55] 6/6/55) OR (1/6/55 [10/6/55] 6/6/55)
เงื่อนไขจะเป็นจริงครับ กล่าวคือจะได้ค่ามาแน่ๆ อย่างน้อย 1 row
แต่ประเด็นคือ จริงๆแล้วไม่ควรจะได้ค่าออกมาครับ เพราะนั่นหมายถึงว่า
พนักงานคนนั้นสามารถลาในวันที่ คาบเกี่ยวกับคราวก่อนได้น่ะซิ
|
 |
 |
 |
 |
Date :
2012-06-10 22:38:27 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อืม...ใช่ครับ มันจะได้ 1 Rows ครับ ว่าแต่วัตถุประสงค์ของ จขกท. ต้องการ SELECT ว่าถ้ามี Rows มากว่า > 0 แสดงว่าเลือกซ้ำ และลาไม่ได้ หรือเปล่าครับ หรือว่าผมเข้าใจผิด
|
 |
 |
 |
 |
Date :
2012-06-10 22:54:36 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อ๋อ อืม..... คิดไม่ทัน
|
 |
 |
 |
 |
Date :
2012-06-10 22:59:44 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองให้คุณ Unidentifer ช่วยต่อน่ะครับ ผมไปนอนล่ะ ดึกแล้ว ถ้ายังไม่ได้ เดียวพรุ่งนี้มาช้วยต่อครับ
|
 |
 |
 |
 |
Date :
2012-06-10 23:02:18 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เอาความเป็นจริงมาคุยกันน่ะครับ
ถ้าลาคราวก่อนวันที่ 2-5 มิถุนา
แต่ถ้าผู้ใช้เลือกลา 4 - 8 มิถุนา ก็ไม่ควรจะลาได้ จริงมั๊ย
หรือจะเลือกลา วันที่ 5-10 มิถุนา ก็ไม่ควรจะลาได้ เพราะวันที่ 5 มิถุนา ลาไปแล้ว
ผมว่าเราคิดมากไปครับ เราก็กลับไปใช้ and ตามเดิมดีกว่ามั้ง
|
 |
 |
 |
 |
Date :
2012-06-10 23:04:11 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมว่าเรามีอีกวิธีนึง คือการกำหนด minDate:0 ใน datepicker ครับ
มันจะทำการลาย้อนหลังไม่ได้เลย คือก่อนที่พนักงานจะลาจริงๆ อาจลาป่วยหรือลากิจแบบฉุกเฉิน
ก็ต้องบอกเพื่อนพนักงานด้วยกันว่าช่วยทำการลาให้ด้วยน่ะ อะไรแบบนี้ล่ะครับ
|
 |
 |
 |
 |
Date :
2012-06-10 23:15:21 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
หรือว่าเอาวันที่ปัจจุบัน ไปลบกับวันลาวันสุดท้ายของการลาครั้งล่าสุด ได้ผลลัพธ์เท่าไหร่ให้ลบด้วย 1 แล้วนำใช้ในการกำหนด
minDate ใน datepicker ก็ได้ครับ พนักงานก็จะทำการลาได้ไม่ซ้ำกับช่วงเวลาที่เคยลาไปแล้ว
|
ประวัติการแก้ไข 2012-06-10 23:21:38
 |
 |
 |
 |
Date :
2012-06-10 23:19:29 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เอาแบบนี้น่ะ
ลาครั้งก่อน วันที่ 1 มิย 55 - 6 มิย 55
วันนี้วันที่ 10 มิย 55
เราเอาวันที่ 10 มิย 55 ลบด้วย 6 มิย 55 ได้ 4วัน
เราก็ใช้ minDate:3
ทีนี้ก็กดเลือกวันลาได้ไม่เกินกว่าวันลาวันสุดท้าย ของการลาครั้งก่อนได้ล่ะครับ
|
 |
 |
 |
 |
Date :
2012-06-10 23:33:15 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
คงจะได้แล้วใช้หรือเปล่าครับ 
|
 |
 |
 |
 |
Date :
2012-06-11 06:15:54 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองดูแบบนี้อีกทีครับ
Code (PHP)
<?
$sql = "SELECT * FROM absence
WHERE (employee_id = '".$employee_id."') and (((('".$inputStart."' BETWEEN stdate and endate) or ('".$inputEnd."' BETWEEN stdate and endate)) ) OR (((stdate BETWEEN '".$inputStart."' and '".$inputEnd."') or (endate BETWEEN '".$inputStart."' and '".$inputEnd."'))))
";
?>
|
 |
 |
 |
 |
Date :
2012-06-11 06:19:04 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อิอิ ผมลองให้ดูเฉย ๆ ครับ ถ้าได้ เดียวจะแปลง Query ให้มันดีกว่าเดิม
|
 |
 |
 |
 |
Date :
2012-06-11 06:21:29 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แล้วแก้ปัญหาเรื่องคร่อม หรือคาบเกี่ยววันลาได้มั๊ย
|
 |
 |
 |
 |
Date :
2012-06-11 08:00:03 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
คิดว่าน่าจะครอบคลุมแล้วน่ะ 
|
 |
 |
 |
 |
Date :
2012-06-11 08:47:11 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|