1

従業員のスケジュールをデータベースに保存できるソフトウェアを考え出す必要があります。私は現在このデザインを持っています:

 CREATE TABLE IF NOT EXISTS `schedules` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `employee_id` varchar(32) NOT NULL,
   `day_of_week` int(2) NOT NULL,
   `starting_time` time DEFAULT NULL,
   `ending_time` time DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

かなり簡単です。今日の日付を出力し、曜日を把握し、データベースからすべての一致を取得しますが、同じことを達成するためのより良い方法を知りたい.

従業員のスケジュールをカレンダーに表示する必要があり、表示するにはカレンダーに日付を渡す必要があります。ただし、特定の従業員が水曜日に出勤するという情報しかない場合、カレンダーに日付を渡すことはできません。

後者のデータベース設計を考えると、月/年のすべての水曜日または月曜日を取得する方法はありますか?

ありがとうございました!

編集

曜日を実際の日付に変更するには、逆方向 (またはより良い代替手段) に戻る必要があります。

これらは私の「制限」です:

  • 私のカレンダー コントロールは、UI に「イベント」を表示するために日付を必要とします。
  • 従業員はスケジュールを一度だけ提出する必要があります。

例: John Doe は月曜日、水曜日、金曜日に勤務します。8:00~12:00。

その情報は、私の現在のデータベース設計では、次のように表されます。

ID, employee_id, day_of_week, starting_time, ending_time
1, John Doe, 1, 8:00, 12:00
2, John Doe, 3, 8:00, 12:00
3, John Doe, 5, 8:00, 12:00

特定の月のカレンダー UI に日付を渡すことができる必要があります。

たとえば、自分のカレンダー コントロールに伝える方法を考え出すことができるはずです。John Doe は、"day_of_week" = 1 (月曜日)

編集2

私の現在の醜い解決策は次のとおりです。月のすべての日をループし、データベースを毎日クエリします。

編集 3 - 解決策

RSのおかげで、問題を解決できました。テーブルはそのままにしましたが、 rsschedulesが提案したテーブルを作成しましたrs が共有する記事に記載されているテーブルを作成した後、 次のクエリが機能しました。

 SELECT CONCAT(users.firstname,\" \",users.lastname) as employee_name, 
 DATE_FORMAT(DATE, '%a %b %d %Y') as date, schedules.starting_time,
 schedules.ending_time FROM dates_d 
 RIGHT JOIN schedules ON schedules.day_of_week = dates_d.day_of_week
 LEFT  JOIN users ON schedules.employee_id = users.ID

配列を JSON エンコードしたところ、Calendar コントロールがついに魅力的に機能しました。

4

2 に答える 2

3

日付テーブルを作成し、そのテーブルのキーを使用してここに保存できます。日付テーブルを使用すると、さまざまな日付変数でデータをクエリできます。例: day, week, day of week, quarterdwhworld.com/2010/08/date-dimension-sql-scripts-mysql

あなたのschedulesテーブルは持っていて、テーブルにid, emplid, date_id参加schedulesして日付、曜日を1回のクエリで取得できます。その後、この日付フィールドをコントロールで使用できますdateschedules.date_id = datetble.date_id

于 2012-08-06T19:23:56.810 に答える
1

代わりにday_of_week列を日付型にしないのはなぜですか。この日付から日を取得したい場合は、MySQL のDayOfWeek関数を使用できます。この同じ日付を使用して、UI でカレンダー コントロールに渡すことができます (それが目的だと思います)。

コメントを詳しく説明するには: John Doe が作業を予定している日付をユーザーが (おそらくjQuery UI の datepickerを介して) 入力しないと、UI レベルでスケジュールをレンダリングするときに、次のクエリを使用してそれらを取得します月曜日のスケジュール:

SELECT * 
FROM schedules 
WHERE DAYOFWEEK(schedule_date) = 1
AND employee_id = (
    SELECT employee_id
    FROM employees
    WHERE employee_name = 'John Doe'
)

明らかに、このクエリは従業員テーブルに対していくつかの仮定を行っており、特にエレガントではありませんが、私の意味を説明するのに役立ちます.

RE: 編集

OK、これであなたの言いたいことがわかりました。基本的に、指定された日(月曜日としましょう)に着陸する2つの範囲(おそらく)の間のすべての日付を提供する関数を求めています。これ はPHPですでに行われているようですので、それは役に立つでしょうか? または、これを行う必要がある特定のテクノロジーを念頭に置いていますか?

編集3

これはより洗練された解決策のようです: mondays tuesdays などを取得します。これから、SQL で DayOfWeek をクエリし、関数の 3 番目の引数として渡すことができる整数の配列を返すことができます。

于 2012-08-06T15:07:16.433 に答える