• בלוג
  • סדרת SQL בסיסי - פוסט 18 - פונקציות לעבודה עם תאריכים

סדרת SQL בסיסי - פוסט 18 - פונקציות לעבודה עם תאריכים

27/08/2024

עבודה עם תאריכים היא אחד האתגרים הגדולים של מערכות מחשב. בסיסי נתונים מנסים לעזור לנו בזה ומאפשרים לנו לשמור עמודה מסוג תאריך וגם מספקים מספר פונקציות לחישובים על עמודות תאריכים. שימו לב שבסיסי נתונים לא יודעים להתמודד עם אזורי זמן ולכן הפונקציות שנראה תמיד מקבלות רק תאריך ושעה, וזו תהיה אחריות של מי שמשתמש בבסיס הנתונים "לסדר" את השעונים כשהמערכת צריכה לשמור מידע על שעות באזורי זמן שונים.

1. התאריך והשעה הנוכחיים ב SQLite

שלושת הפונקציות הראשונות שארצה להראות הן date, time ו datetime. הן מחזירות את התאריך הנוכחי, השעה הנוכחית והתאריך והשעה הנוכחיים. בואו נראה אותן בפעולה. תחילה הפונקציה date שמחזירה את התאריך בפורמט שנה-חודש-יום:

select date();

הפונקציה time מחזירה את השעה הנוכחית:

select time();

והפונקציה datetime מחזירה מחרוזת שמתאימה לתאריך ולשעה הנוכחיים:

select datetime();

שימוש ראשון בפונקציות אלה יהיה כדי להכניס מידע חדש לבסיס נתונים. שימו לב לטבלת המשימות הבאה:

create table tasks(id integer primary key, text text, due_date datetime);

נכניס מספר משימות:

insert into tasks(text, due_date) values
('eat breakfast', datetime()),
('learn sql', datetime()),
('have a party', datetime());

select * from tasks;

וקיבלנו:

id  text    due_date
1   eat breakfast   2024-08-05 10:09:15
2   learn sql   2024-08-05 10:09:15
3   have a party    2024-08-05 10:09:15

התאריך הוכנס אוטומטית להיות התאריך והשעה הנוכחיים. אבל האמת שביצירת משימות עדיף לתת לבן אדם כמה שעות או ימים כדי לסיים את המשימה. ניצור מחדש את הטבלה הפעם עם שתי עמודות תאריך, אחת לתאריך בה נוצרה המשימה ושנייה לתאריך היעד:

create table tasks(
  id integer primary key,
  text text,
  created_at datetime,
  due_date datetime);

בשביל להכניס נתונים אני רוצה לקבל מ datetime את התאריך של מחר בבוקר. זה נראה ככה:

select datetime('now', '+1 day');

כמובן שאתם יכולים להעביר מספר ימים שונה או אפילו שעות, דקות, חודשים או שנים. המילה now מתיחסת לזמן עכשיו, ואפשר במקומה להעביר מחרוזת שתייצג את התאריך ממנו מתחילים, לדוגמה:

select datetime('2024-01-01', '+1 day')

בחזרה לטבלת המשימות שלנו - כך אני יכול להוסיף משימות שתאריך היצירה שלהן הוא עכשיו ומועד הסיום שלהן מוגדר לשבוע הבא:

insert into
    tasks(text, created_at, due_date)
    values('task 1', datetime(), datetime('now', '+7 days'));

2. התאריך והשעה הנוכחיים ב SQL Server

סיפרתי כבר שיש לנו בעיה של תאימות? נו, אז יש לנו. בשביל לקבל את התאריך והשעה הנוכחיים ב SQL Server נשתמש בביטוי CURRENT_TIMESTAMP בלי סוגריים באופן הבא:

select CURRENT_TIMESTAMP;

ובשביל להוסיף לו יומיים אני מפעיל פונקציה נפרדת בשם DATEADD:

SELECT DATEADD(day, 2, CURRENT_TIMESTAMP);

3. התאריך והשעה הנוכחיים בפוסטגרס

פוסטגרס כולל את הערך CURRENT_TIMESTAMP של SQL Server ובנוסף את הערכים CURRENT_TIME ו CURRENT_DATE כדי לקבל את הזמן או התאריך הנוכחי. בנוסף יש פונקציה בשם now() שמחזירה את אותו ערך. בשביל חישובים יש אופרטור בשם interval שעובד כך:

SELECT now() + INTERVAL '2 days'

4. עכשיו אתם

  1. השתמשו באתר https://sqliteonline.com ובנו את טבלת המשימות עם הנתונים לדוגמה ב SQL Server ובפוסטגרס.

  2. קראו על הפונקציה strftime של SQLite בקישור https://www.sqlitetutorial.net/sqlite-date-functions/sqlite-strftime-function/.

  3. קראו על הפונקציה format של SQL Server בקישור https://learn.microsoft.com/en-us/sql/t-sql/functions/format-transact-sql?view=sql-server-ver16