#ยังคิดถึงเสมอ

กะละมังอาบน้ำของมังกี้ยังวางอยู่หน้าบ้านเหมือนเดิม
สายจูง ลูกบอลอีกลูกก็ยังอยู่ในลังของเล่นอยู่
บางครั้งก็มีขนเธอปลิวมาบ้าง ถึงแม้เราจะทำความสะอาดบ้านครั้งใหญ่ไปหลายรอบละ
ต้นมะลิที่ปลูกไว้หลังบ้าน ตรงที่เธอนอนอยู่… ต้นที่เป็นของเธอก็ยังรอดปลอดภัย
ผ่านมาปีนึงละ ก็ยังคิดถึงเธอเสมอ

 

 

Hierarchical and recursive queries in MySQL

Hierarchical query คืออะไร ?

A hierarchical query is a type of SQL query that handles hierarchical model data. They are special cases of more general recursive fixpoint queries, which compute transitive closures.

อยากบอก(บ่น) ว่าก่อนที่ MySQL 8 จะออกนี่การดึงข้อมูลแบบลำดับชั้นลักษณะต้นไม้ (Tree) แบบนี้โคตรเปลืองพลังงาน แต่ตอนนี้ดีขึ้นมาก ต้องขอบคุณจริง ๆ ที่ MySQL อิมพลีเมนต์ Common Table Expression (CTE) ให้ใช้ได้ซะที เขียนคำสั่งสั้นลง ประสิทธิภาพดีขึ้น (ก็แหงสิเจ้าของเค้าทำออกมาเอง)

ยกตัวอย่างข้อมูลลักษณะแบบลำดับชั้น เช่น โครงสร้างองค์กร เธรดในคอมเมนต์ต่าง ๆ ข้อมูล Categories and sub-categories ที่เห็นภาพชัด ๆ  เลยคือ โครงสร้างองค์กร (Organization charts ) นี่ง่ายสุดละ มีหัวหน้าเป็นรูทและมีลูกน้องในความดูแลและบางทีลูกน้องก็มีเบ้ต่อลงไปอีกที ลักษณะข้อมูลแบบรูปนี้เลย


ว่าแล้วก็ติดตั้ง MySQL 8 สำหรับใช้งานกัน

docker run -d -p 3306:3306 --name mysqltest --restart always -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=demo mysql:8

โดยธรรมเนียมปฏิบัติทั่วไป ของตารางที่เก็บข้อมูลในลักษณะนี้ก็จะออกแบบคล้าย ๆ แบบนี้ โดยให้คอลัมภ์ parent เก็บข้อมูลหัวหน้า

DROP TABLE IF EXISTS category;
CREATE TABLE IF NOT EXISTS category(
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(20) NOT NULL,
        parent INT DEFAULT NULL
);

INSERT INTO category VALUES
(1,'Root A', NULL),
(2,'Item 1', 1),
(3,'Item 2', 1),
(4,'Item 3', 3),
(5,'Root B', NULL),
(6,'Item 4', 5),
(7,'Item 5', 6),
(8,'Root C', NULL),
(9,'Item 6', 8);

การดึงข้อมูลในลักษณะ Recursive MySQL ได้เตรียมคำสั่งให้แล้ว รูปแบบการใช้งาน

with_clause:
    WITH [RECURSIVE]
        cte_name [(col_name [, col_name] ...)] AS (subquery)
        [, cte_name [(col_name [, col_name] ...)] AS (subquery)] ...

ลักษณะของคำสั่งนี้คือ


*ภาพจาก mysqltutorial : A Definitive Guide To MySQL Recursive CTE

เรามาดูผลลัพธ์กัน

WITH RECURSIVE categorypath(id, name, dept, breadcrumbs) AS
(
  SELECT id, name, 0, CAST(name AS CHAR(1000))
  FROM category 
  WHERE parent IS NULL
  UNION ALL
  SELECT c.id, c.name, cp.dept + 1, CONCAT_WS('/', cp.breadcrumbs, c.name) 
  FROM categorypath cp 
    JOIN category c ON cp.id = c.parent
)
SELECT * FROM categorypath ORDER BY breadcrumbs;

ไปอ่านเพิ่มเติมกันได้ที่

  • https://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/
  • https://www.percona.com/live/17/sites/default/files/slides/Recursive%20Query%20Throwdown.pdf
  • https://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL

จบปิ๊ง ^__^
ป.ล.1 วันหยุด วันฝนตกฉันควรนอนกกใครสักคนอยู่ใต้ผ้าห่มนี่นา
ป.ล.2 เศร้าาาวันทำงาน

มินิรีวิว Mi Notebook Pro กับหนึ่งเดือนที่ผ่านมา

เมื่อช่วงเดือนพฤศจิกายนปีที่แล้ว (2017) Xiaomi ได้จัดงาน Mi Product Launch และเปิดตัว Mi Notebook Pro แล็บท็อปสุดบางสเปคระดับบน ซึ่งเป็นรุ่นต่อจาก Mi Notebook Air โดยเปิดตัวรุ่นย่อยออกมาแยกตามซีพียูและความจุ ดังนี้

  • Core i5 + RAM 8GB ราคา 5599 หยวน (28,xxx บาท)
  • Core i7 + RAM 8GB ราคา 6399 หยวน (32,xxx บาท)
  • Core i7 + RAM 16GB ราคา 6999 หยวน (35,xxx บาท)

เราเองเพิ่งได้เครื่องตัว Core i7 RAM 16GB มาเดือนที่แล้ว สนนราคาที่ขายในไทยก็อยู่ที่ 37,900 บาท (ก็ยังถือเป็นเครื่องหิ้วอยู่ ศูนย์ Xiaomi ในไทยยังไม่มีวี่แววว่าจะนำเข้ามาจำหน่าย)

ดีไซน์และตัวเครื่อง

ดีไซน์โดยรวมของตัวเครื่องบอกตรง ๆ ว่าเอามาชนกับ Macbook Pro ของ Apple แน่นอนอย่างไม่ต้องสงสัย โดยดีไซน์ภายนอกของ Mi Notebook Pro สีเทาเข้ม(Dark Gray) บอดี้ทำจากแม็กนีเซียมอัลลอย หนัก 1.95 กก. หน้าจอขนาด 15.6 นิ้ว Full-HD (1920×1080) 16:9 IPS display ขอบจอบาง ครอบทับด้วย Gorilla Glass 3 ซีพียูเป็น Intel Core i7 Gen 8 มี 4 แกน 8 เธรด ความถี่ 4.0 GHz การ์ดจอ NVIDIA GeForce MX150 สำหรับอัลตร้าบุ๊ค แรม DRR4 ขนาด 16 GB SSD PCIe NVMe ขนาด 256GB
คีย์บอร์ดขนาดฟูลไซส์ มีไฟ backlit สำหรับใช้งานในที่มืดและบริเวณ Touchpad มีเซนเซอร์สแกนลายนิ้วมือมาให้ด้วย ใช้ในการล็อกอินผ่าน Windows จากการใช้งานถือว่าทำงานได้เร็วและแม่นยำมาก ส่วนพอร์ทสำหรับเชื่อมต่อมี

  • USB Type C จำนวน 2 พอร์ท โดยแยกเป็น 1 พอร์ทที่รองรับเฉพาะถ่ายโอนข้อมูล อีกพอร์ทเป็น Full Functional ทั้งชาร์จไฟและถ่ายโอนข้อมูล
  • Full HDMI
  • USB 3.0 จำนวน 2 พอร์ท
  • พอร์ท 3-in-1 SD Card
  • ช่องหูฟัง 3.5 มม.

ส่วนสเปคอุปกรณ์อื่นก็มี

  • ลำโพง Harman Infinity มาพร้อมระบบเสียง Dolby Atmos
  • SSD 256GB PCIe (พร้อมช่อง NVMe อีก 4 ช่องสำหรับเพิ่มหน่วยความจำ)
  • Wi-Fi AC Dual-Band

การใช้งานและแบตเตอรี่

จากการใช้งานมาได้สักระยะ ปัญหาที่พบคือปัญหาเรื่องพอร์ทเชื่อมต่อ ที่จริงก็ไม่ใช่ปัญหาของ Mi Notebook Pro หรอก โดยลักษณะใช้งานของตัวเองที่ใช้งานพอร์ทอีเธอร์เนตเป็นหลักรวมทั้งพอร์ท VGA ซึ่งก็หลีกหนีไม่พ้นต้องหาอุปกรณ์เพิ่ม ส่วนการใช้งานอื่นที่เครื่องมีมาให้สามารถรองรับได้ในระดับที่น่าพอใจ

ส่วนแบตเตอรี่ (สเปคเป็น 8000mAh lithium-polymer battery) จากการใช้งานเฉลี่ยก็ราว ๆ 8 ชั่วโมงทั้งนี้ทั้งนั้นก็ขึ้นกับลักษณะการใช้งานด้วย ระยะเวลาชาร์ทอยู่ที่ 1 ชั่วโมงกว่า รองรับ Quick charge ราว ๆ 35-40 นาทีก็ 50% อันนี้เราว่าผ่านกรณีสำหรับการเป็นอัลตร้าบุ๊ค

สรุป

Mi Notebook Pro นับเป็นอัลตราบุ๊คที่ประสิทธิภาพต่อราคาถือว่าคุ้มค่า ด้วยการออกแบบและวัสดุเองที่เน้นความสวยงามและมินิมอลิลต์ตามเทรนด์นิยม การแสดงผลของหน้าจอ IPSขนาด 15.6 นิ้วก็ทำได้ดี การใช้งานกรณีอยู่กลางแจ้งก็ไม่ได้แย่อะไร

ข้อดี

  • ตัวเครื่องและวัสดุให้ความรู้สึกพรีเมี่ยม
  • ประสิทธิภาพดี (i7-8550U รวมกับ RAM 16GB นี่สบาย)
  • เสียงจากลำโพงดีเลย
  • Touchpad ตอบสนองได้ดี
  • แสกนลายนิ้วมือทำงานได้เร็วและแม่นยำ
  • คุ้มค่า

ข้อเสีย

  • การระบายความร้อนยังทำได้ไม่ดี
  • Windows 10 เป็นเวอร์ชั่นภาษาจีน
  • แป้นคีย์บอร์ดไม่มีภาษาไทย

ป.ล.

  • เพื่อให้รองรับกับพฤติกรรมใช้งานตัวเองเราสั่ง USB Type C To VGA Ethernet with USB 3.o x 2 Adapter เพิ่ม
  • เนื่องจาก Mi Notebook Pro รองรับการเพิ่ม SSD อยู่แล้ว ก็คงได้เพิ่มจริง ๆ 256 สำหรับเรานี่ไม่พอ
  • เครื่องเราทำ  Dual Boot (Windows 10 + Ubuntu 18.04)

Convert pdf to image – แปลงไฟล์ PDF เป็นรูปภาพด้วย Linux บน Windows กัน

จั่วหัวมาแบบนี้ก็อย่าเพิ่งสับสน ณ วันนี้ (พฤษภาคม 2561) Linux กับ Windows เป็นมิตรกันมากกกกกกกกกซึ่งก็ถือเป็นเรื่องที่ดีจริง ๆ สำหรับคนในวงการคอมพิวเตอร์และทั่ว ๆ ไปถือว่าดีกับทุกฝ่ายหล่ะกัน (ลองหาข่าวช่วงก่อนหน้านี้ดูคร่าว ๆ ได้ว่าสังคมสรรเสริญเรื่องนี้กันขนาดไหน) ถ้าใครอยากลองใช้งาน Linux บน Windows ก็ทำตามคร่าว ๆ ประมาณนี้ (แบบละเอียดก็ตามเอกสารตัวนี้ได้เลย)

  1. เปิด PowerShell รันคำสั่งนี้

    รอสักครู่เพื่อให้ระบบเปิดใช้งานฟีเจอร์ “Windows Subsystem for Linux”
  2. เปิด Microsoft Store เพื่อติดตั้ง Ubuntu ต่อได้เลย

    ขนาดไฟล์ก็ไม่ใหญ่มาก
  3. พอติดตั้งเสร็จเราก็เริ่มใช้งานกันได้เลย
  4. จะเห็นได้ว่าเวอร์ชั่นที่ติดตั้งยังเป็น 16.04 (Xenial Xerus) อยู่ ณ ปัจจุบันก็ 18.04 ไปเรียบร้อยแล้ว แต่แค่นี้ก็เพียงพอสำหรับการใช้งานละ ^_^

พอระบบพร้อมสำหรับใช้งานก็มาเริ่มแปลงไฟล์ PDF เป็นรูปภาพกัน (มันมีที่มานิดนึงว่าทำไมต้องใช้วิธีแบบนี้ เนื่องจากเรามีไฟล์ PDF จำนวนมากก จำนวนหนึ่งที่ต้องแปลงเป็นไฟล์รูปภาพแบบด่วน ๆ ลองค้นเครื่องมือบนวินโดวส์ที่เป็นเครื่องมือฟรีรวมถึงออนไลน์ด้วยก็พบว่ามีจำนวนน้อยเกินไป ตัวดี ๆ ก็ Commercial ซะ เศร้าาา และบวกกับความขี้เกียจและเคยชินว่า Linux แปลงไฟล์ตามโจทย์นี้แบบสะดวกเลย แค่นั้นแหล่ะ) เริ่มเลยหล่ะกัน

  1. สร้างไฟล์ Bash Script มา 1 ไฟล์
    #!/bin/bash
    for file in *.pdf ; do
      convert -verbose -density 300 -quality 100 "${file}" "${file%.*}".png
    done

    โดยเราใช้โปรแกรมที่ชื่อว่า convert ที่อยู่ใน imagemagick package ก็ให้ติดตั้งโดยใช้คำสั่ง

    sudo apt-get install imagemagick

    ซึ่ง Bash script ข้างบนจะทำการแปลงทุกไฟล์ที่นามสกุล *.pdf ใน Directory ปัจจุบัน และบันทึกเป็นไฟล์รูปภาพนามสกุล *.png ส่วน พารามิเตอร์ที่ใช้ ก็ตามไปอ่านต่อที่นี่ได้

  2. ลองทดสอบกัน สมมุติเรามีไฟล์ pdf จำนวนหนึ่ง ตัวอย่างมีไฟล์ 2 ไฟล์ ไฟล์ละ 2 หน้า (ไฟล์เดียวกันนั่นแหล่ะ)

  3. รัน Bash Script เพื่อแปลงไฟล์เป็นรูปภาพซะ

    เราจะได้ไฟล์รูปภาพ 1 ไฟล์ ต่อ 1 หน้ารันลำดับชื่อไฟล์
  4. จบปิ๊ง

Get random 2 rows from each group

การสุ่มตัวอย่าง (Sampling) หมายถึง กระบวนการเลือก “ตัวอย่าง” จาก “ประชากร” เพื่อให้กลุ่มตัวอย่างเป็นตัวแทนของประชากรในการให้ข้อมูล การที่จะเลือกตัวอย่างให้เป็นตัวแทนที่ดีของประชากรได้นั้น จะต้องทำการเลือกแบบสุ่ม (random) หรือเลือกอย่างไม่ลำเอียง (unbias)

นี่เป็นความหมายของการสุ่มตัวอย่าง ซึ่งหลายครั้งเราก็หลีกเลี่ยงไม่ได้ที่จะเลือกข้อมูลบางกลุ่มข้อมูลมาทำงาน ปกติก็ใช้หลักจากข้างบนนั่นแหล่ะเลือกมา (จะใช้วิธี 1-5 ก็เอาที่สบายใจ)

ในกลุ่มมีคำถามนึงน่าสนใจ ถามขึ้นในกลุ่มตามนี้

คร่าว ๆ ก็คืออยากได้กลุ่มข้อมูลมาจำนวนนึงแยกตามรหัส/กลุ่มการวินิจฉัยโรค มาดูอีก 1 วิธีกัน

  1. สร้างตารางทดสอบกัน (เอาตารางเกี่ยวกับผลไม้เนี่ยแหล่ะ เมื่อเช้าจัดมา //แพคเกจแบบนี้โคตรตอบโจทย์เอาจริง ๆ คือกินวันนึงก็ 1-2 ลูกเอง เยอะหน่อยก็ช่วงเล่นกีฬา แล้วกล้วยหอมหวีนึงนี่ก็ใช่ว่าหวีเล็ก ซื้อมาเป็นหวีทีก็กินไม่หมด T_T)

    CREATE TABLE fruits
        (`type` varchar(50), `variety` varchar(50), `price` float)
    ;
        
    INSERT INTO fruits
        (`type`, `variety`, `price`)
    VALUES
     ('apple', 'gala', 2.79),
     ('apple', 'fuji', 0.24),
     ('apple', 'limbertwig', 2.87),
     ('orange', 'valencia', 3.59),
     ('orange', 'navel', 9.36),
     ('pear', 'bradford', 6.05),
     ('pear', 'bartlett', 2.14),
     ('cherry', 'bing', 2.55),
     ('cherry', 'chelan', 6.33);

     

  2. ใช้ฟังก์ชั่น RAND() ใน MySQL เพื่อให้ได้ค่าตัวเลขที่ได้จากการสุ่มขึ้นมาและทำการจัดเรียงตามกลุ่ม (กำหนดเงื่อนไข) ในที่นี้เรียงตาม `type`

    RAND() – Returns a random floating-point value v in the range 0 <= v < 1.0

    SELECT
        type,
        variety,
        price,
        RAND()
    FROM fruits
    ORDER BY type, 4

  3. ใส่ลำดับที่ของแต่ละกลุ่มไว้
    SET @num:=0, @type:='';
    SELECT
        @num:=IF(@type = A.type, @num + 1, 1) as number,
        @type:=A.type as dummy,
        A.*
    FROM (
      SELECT
        type,
        variety,
        price,
        RAND()
      FROM fruits
      ORDER BY type, 4
    ) A

  4. เลือกจำนวนกลุ่มตัวอย่างตามที่ต้องการ (ในคำถามเลือก 2 ตัวอย่าง)
    ...
    WHERE number <= 2

    ผลลัพธ์ที่ได้คือรายการที่ได้จากการสุ่มกลุ่มละ 2 ตัวอย่าง

  5. ขอให้สนุกกับเดือนแห่ง QOF จร้าาา

ป.ล.
ลองรันทดสอบได้ที่ http://sqlfiddle.com/#!9/350bc7/6

ปรับปรุงข้อมูลวันหยุดราชการ (Holiday) กัน

สำหรับประชาชนคนไทยแล้วคำว่า “ในเวลาราชการ” นี่น่าจะคุ้นเคยกันเป็นอย่างดี เรามักเห็นคำนี้ติดตามหน่วยงานราชการ แล้วคำว่าในเวลาราชการนี่มันยังไง เอาแบบกำปั้นทุบดิน ก็คือวันที่ไม่ใช่วันหยุดราชการนั่นแหล่ะ 😛

แล้ววันหยุดราชการนี่เราก็เริ่มยึดตาม “ประกาศกำหนดวันหยุดราชการนักขัตฤกษ์ พระพุทธศักราช ๒๔๕๖” ซึ่งพระบาทสมเด็จพระมงกุฎเกล้าเจ้าอยู่หัว รัชกาลที่ ๖ ทรงออกประกาศดังกล่าว ถ้าใครจะศึกษารายละเอียดบล็อกนี้ก็อธิบายไว้เป็นอย่างดี

ทีนี้ตัวที่เกี่ยวข้องกับโรงพยาบาลยังไงบ้าง หลาย ๆ หน่วยงานที่มีระบบคอมพิวเตอร์ไว้ทำงานอย่างเช่นโรงพยาบาล หน่วยบริการหรืออื่น ๆ นี่ก็มักมีตารางวันหยุดในปีนั้น ๆ สำหรับการทำงาน ซึ่งก็จะเป็นตาราง ตารางนึงตามแต่ละเวนเดอร์ (Vendor) สร้างขึ้นรายละเอียดแตกต่างกันบ้าง แต่ส่วนใหญ่แล้ววัตถุประสงค์ก็เพื่อระบุว่าวันใดคือวันหยุดราชการนั่นแหล่ะ ปกติหน้าที่อัพเดตข้อมูลนี้ก็จะเป็นของผู้ดูแลระบบของหน่วยบริการ ข้อมูลพวกนี้ส่วนใหญ่ก็มาจาก ประกาศทางราชการหรือเว็บทั่ว ๆ ไป เช่น วิกิพีเดีย

และอีกเว็บไซต์ก็ myhora ซึ่งมีบริการ iCal บริการ

จะเห็นได้ว่ามีไฟล์ CSV (Comma-separated values) ให้เราได้ใช้ด้วย งั้นเราก็มาปรับปรุงวันหยุดราชการด้วยไฟล์ตัวนี้กัน

  1. เริ่มต้นก็ดาวน์โหลดมาซะ
    wget -O th_holiday.csv http://www.myhora.com/calendar/ical/holiday.aspx?2561.csv

    หน้าตาข้อมูลไฟล์คร่าว ๆ ก็ประมาณนี้

  2. นำเข้าข้อมูลข้างต้นลงในฐานข้อมูลของเราด้วยคำสั่ง LOAD DATA INFILE (สร้างตารางชั่วคราว th_holiday ไว้รอรับด้วย )
    DROP TABLE IF EXISTS th_holiday;
    CREATE TABLE IF NOT EXISTS th_holiday(
        Subject       	VARCHAR(255) NULL
        ,Start_Date    	DATE NOT NULL
        ,Start_Time    	TIME NULL
        ,End_Date      	DATE NULL
        ,End_Time      	TIME NULL
        ,All_day_event 	VARCHAR(4) NOT NULL
        ,Description   	VARCHAR(255) NOT NULL
        ,Show_time_as  	INTEGER  NOT NULL
        ,Location      	VARCHAR(30)
    );
    
    TRUNCATE th_holiday;
    LOAD DATA LOCAL INFILE 'th_holiday.csv' 
    INTO TABLE th_holiday
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"'
    ESCAPED BY '"'
    LINES TERMINATED BY '\r\n'
    (`Subject`, @start_date, `Start_Time`, `End_Date`, `End_Time`, `All_day_event`, `Description`, `Show_time_as`, `Location`)
    SET start_date = STR_TO_DATE(@start_date, '%d/%m/%Y');
  3. เป็นอันเสร็จสิ้น ทีนี้ก็นำข้อมูลนี้ไปปรับปรุงในตารางของแต่ละ HIS

 

 

Dockerized Primitive Pictures – Reproducing images with vector-based geometric primitives

มีโปรเจคบน github ที่ใช้สร้างรูปภาพด้วย geometric primitives สำหรับใครที่ชอบรูปภาพแบบนี้จะรู้สึกแบบฟินมากที่มีโปรเจคนี้ขึ้นมา ปรบมือให้เลยหล่ะกัน 👏 👏 👏 👏 👏
ภาพ geometric primitives คือ ? จะอธิบายไงดีให้ภาพมันอธิบายตัวเองหล่ะกัน

รูปใหญ่ ๆ ก็จะประมาณนี้ สวยใช่ไหมล่ะ ^_^

ใครอยากตามไป Fork ก็ตามนี้เลย https://github.com/fogleman/primitive  ส่วนเราก็มาลองสร้าง Docker กัน

  1. เราใช้ Image จาก Go (golang) is a general purpose, higher-level, imperative programming language
FROM golang:alpine
MAINTAINER M
LABEL version="latest"

RUN apk add --no-cache git && \
mkdir -p /opt && cd /opt && \
go get -u github.com/fogleman/primitive

VOLUME /opt
WORKDIR /opt

CMD ["/bin/sh"]
  • มาลองใช้งานกัน
    docker run -it --rm -v /path/data:/opt primative:alpine primitive -i input.png -o output.png -n 100
  • มาดูผลลัพธ์กัน
  • ชอบ ๆ ๆ 😍😍😍😍

เหมือนเพิ่งผ่านไปเมื่อวาน

วันนี้ก็ครบหนึ่งสัปดาห์ของการจากไปของมังกี้ เราแทบจะบรรยายไม่ได้เลยว่าความรู้สึกมันแย่ขนาดไหน และเอาเข้าจริง ๆ ก็ไม่ได้เรียนรู้ธรรมะ สัจธรรมหรือความจริงของโลกอะไรจากการสูญเสียครั้งนี้หรอก แค่หวังว่าชีวิตจะมีสติในเร็ววัน

ปล. ถ้านายกลับมาอ่านบันทึกนี้นายอาจจะเข้มแข็งขึ้นจนจำความรู้สึกนี้ไม่ได้อีกแล้ว ให้นายดูแลคนที่นายรักให้เกินกว่าที่นายคิดว่าจะทำได้ ถ้ามันจะมีการสูญเสียอะไรอีกครั้ง เราเชื่อว่าจะดีกว่าที่เป็นอยู่ในวันนี้

รักและคิดถึงเสมอ…

การหาปีงบประมาณแบบไทยสำหรับ MySQL

ปีงบประมาณ หรือ ปีงบการเงิน (อังกฤษ: fiscal year, financial year หรือ budget year) เป็นช่วงเวลาที่ใช้สำหรับคำนวณงบการเงินประจำปีในธุรกิจและองค์กรอื่น ๆ ในหลายเขตอำนาจตามกฎหมาย กฎข้อบังคับเกี่ยวกับการบัญชีและการเก็บภาษี จะต้องอาศัยรายงานเหล่านี้อย่างน้อยครั้งหนึ่งต่อสิบสองเดือน แต่ไม่จำเป็นว่าช่วงเวลาที่รายงานนี้จะต้องตรงกับปีตามปฏิทิน ซึงปีงบประมาณของไทยเริ่มตั้งแต่เดือนตุลาคมถึงเดือนกันยายนของปีถัดไป

เราสามารถเขียนฟังก์ชั่น (Function) เพื่อคำนวณหาปีงบประมาณจากฐานข้อมูล MySQL ตามนี้

DELIMITER $$

DROP FUNCTION IF EXISTS THGOVYEAR$$
CREATE FUNCTION THGOVYEAR(
    xdate DATETIME,
    th BIT)
RETURNS INT 
DETERMINISTIC
BEGIN
    RETURN IF(MONTH(xdate) < 10, YEAR(xdate), YEAR(DATE_ADD(xdate, INTERVAL 1 YEAR))) + (543*th);
END$$

DELIMITER ;

โดยตัวแปรที่รับในฟังก์ชั่นเองจะมี 2 ตัว คือ

  • xdate : วันที่ที่ต้องการคำนวณ
  • th : ต้องการแสดงผลแบบปี พ.ศ หรือไม่ (1 = ใช่, 0 = ไม่)

ที่นี้มาลองทดสอบดู โดยการสร้างตารางเก็บวันที่กัน

DROP TABLE IF EXISTS DemoDate;
CREATE TABLE DemoDate (
    fielddate DATETIME NOT NULL
);
INSERT INTO DemoDate (fielddate) VALUES
    ('2008-09-01 00:00:00'),
    ('2008-04-04 00:00:00'),
    ('2009-05-25 00:00:00'),
    ('2010-06-30 00:00:00'),
    ('2011-07-01 00:00:00'), 
    ('2010-10-01 00:00:00'),
    ('2011-10-01 00:00:00'), 
    ('2012-09-30 00:00:00'), 
    ('2012-10-01 00:00:00'),
    ('2013-09-30 00:00:00'),
    ('2012-10-01 00:00:00'),
    ('2013-09-30 00:00:00'),
    ('2013-10-01 00:00:00'),
    ('2014-09-30 00:00:00'),
    ('2014-10-01 00:00:00'),
    ('2015-09-30 00:00:00'),
    ('2015-10-01 00:00:00'),
    ('2016-09-30 00:00:00'),
    ('2016-10-01 00:00:00'),
    (NOW()),
    ('0000-00-00 00:00:00');

แล้วก็มาทดสอบกัน

ขอให้มีความสุขกับการทำงานกัน แด่วันแรงานนนนนนน

**ช่วงนี้ไม่ค่อยได้เขียนบล็อคเลย แต่เขียน ๆ หน่อยเหอะ เดือนละเรื่องก็ยังดี T_T …
**งานช่วงนี้เหรอ ถามว่าท้อไหมตอบเลยว่ามากกกกก (แต่ไม่เคยถอยนะ หันหลังแม่มมเลย 555)