2012-04-02 5 views
1

私は2つのストアドファンクションを使用しています。SELECTと入力すると適切な値を返しますが、これらの値の一部を減らしてサブセットを取得しようとすると、警告なしで設定します。BETWEENを使用しているMySQL DATE_FORMATは機能しません

ここに私のSQLです。

SELECT 
    DISTINCT 
    e.ims_event_id, 
    e.name, 
    e.begin_time bUTC, 
    e.end_time eUTC, 
    DATE_FORMAT(DATE_ADD(e.begin_time, INTERVAL ptat_getTZOffset(pp.subject_to_dlst, tz.delta_time, e.begin_time, country) MINUTE),'%H:%i') begin_local, 
    DATE_FORMAT(DATE_ADD(e.end_time, INTERVAL ptat_getTZOffset(pp.subject_to_dlst, tz.delta_time, e.end_time, country) MINUTE),'%H:%i') end_local, 
    DATE_FORMAT(ptat_getEventHalfPoint(pp.subject_to_dlst, tz.delta_time, e.begin_time, e.duration, country),'%H:%i') begin_local_halfPoint, 
    DATE_FORMAT(DATE_ADD(pp.start_time, INTERVAL ptat_getTZOffset(pp.subject_to_dlst, tz.delta_time, pp.start_time, country) MINUTE),'%H:%i') ptat_begin, 
    DATE_FORMAT(DATE_ADD(pp.end_time, INTERVAL ptat_getTZOffset(pp.subject_to_dlst, tz.delta_time, pp.end_time, country) MINUTE),'%H:%i') ptat_end 
FROM 
    event e 
    JOIN service s ON e.service_uid = s.service_uid 
    JOIN service_ptc sp ON s.service_uid = sp.service_uid 
    JOIN service_primetime_period spp ON s.service_uid = spp.service_uid 
    JOIN primetime_period pp ON spp.primetime_period_uid = pp.primetime_period_uid 
    JOIN time_zone tz ON pp.time_zone_id = tz.time_zone_id 
    JOIN dlst_info dli ON country = 'US' AND dli.year = DATE_FORMAT(e.begin_time,'%Y') 
WHERE 
    (POW(2,DATE_FORMAT(DATE_ADD(e.begin_time,INTERVAL tz.delta_time HOUR), '%w'))&pp.weekdays) > 0 AND 
    e.end_time > NOW() AND 
    e.begin_time < DATE_ADD(NOW(),INTERVAL 8 DAY) AND 
    DATE_FORMAT(ptat_getEventHalfPoint(pp.subject_to_dlst, tz.delta_time, e.begin_time, e.duration, country),'%H:%i') BETWEEN 
DATE_FORMAT(DATE_ADD(pp.start_time, INTERVAL ptat_getTZOffset(pp.subject_to_dlst, tz.delta_time, pp.start_time, country) MINUTE),'%H:%i') AND 
    DATE_FORMAT(DATE_ADD(pp.end_time, INTERVAL ptat_getTZOffset(pp.subject_to_dlst, tz.delta_time, pp.end_time, country) MINUTE),'%H:%i') 
ORDER BY e.begin_time; 

追加されたWHERE句の最後の3行はゼロを返します。それらはコピーされ、SELECTに貼り付けられ、うまく動作します。

私は絶対に困惑しています!

また、比較のために文字列を使用すると(つまり、= '19:00 ')、結果が得られます。誰が何が間違っているのか考えている?

Edit:where句を含まない場合に返されるサンプル行。

| 370617336 | Dancing With the Stars    | 2012-04-04 05:00:00 | 2012-04-04 06:00:00 | 19:00  | 20:00  | 19:30     | 19:00  | 22:00 | 
| 371138764 | Escape Routes      | 2012-04-08 05:00:00 | 2012-04-08 06:00:00 | 19:00  | 20:00  | 19:30     | 19:00  | 22:00 | 
| 371138733 | Who Do You Think You Are?   | 2012-04-07 05:00:00 | 2012-04-07 06:00:00 | 19:00  | 20:00  | 19:30     | 19:00  | 22:00 | 
| 371138638 | The Biggest Loser     | 2012-04-04 05:00:00 | 2012-04-04 06:00:00 | 19:00  | 20:00  | 19:30     | 19:00  | 22:00 | 
| 371676424 | Survivor: One World    | 2012-04-05 05:00:00 | 2012-04-05 06:00:00 | 19:00  | 20:00  | 19:30     | 19:00  | 22:00 | 
| 371676489 | Undercover Boss     | 2012-04-07 05:00:00 | 2012-04-07 06:00:00 | 19:00  | 20:00  | 19:30     | 19:00  | 22:00 | 
| 371676386 | NCIS        | 2012-04-04 05:00:00 | 2012-04-04 06:00:00 | 19:00  | 20:00  | 19:30     | 19:00  | 22:00 | 
| 371412875 | Bones        | 2012-04-03 05:00:00 | 2012-04-03 06:00:00 | 19:00  | 20:00  | 19:30     | 19:00  | 22:00 | 
| 371413006 | American Idol      | 2012-04-06 05:00:00 | 2012-04-06 06:00:00 | 19:00  | 20:00  | 19:30     | 19:00  | 22:00 | 
| 371413149 | Bones        | 2012-04-10 05:00:00 | 2012-04-10 06:00:00 | 19:00  | 20:00  | 19:30     | 19:00  | 22:00 | 
| 371413041 | The Finder       | 2012-04-07 05:00:00 | 2012-04-07 06:00:00 | 19:00  | 20:00  | 19:30     | 19:00  | 22:00 | 
| 370617100 | Once Upon a Time     | 2012-04-09 05:00:00 | 2012-04-09 06:00:00 | 19:00  | 20:00  | 19:30     | 18:00  | 22:00 | 
| 371138792 | Harry's Law      | 2012-04-09 05:00:00 | 2012-04-09 06:00:00 | 19:00  | 20:00  | 19:30     | 18:00  | 22:00 | 
| 371676549 | The Amazing Race     | 2012-04-09 05:00:00 | 2012-04-09 06:00:00 | 19:00  | 20:00  | 19:30     | 18:00  | 22:00 | 

EDIT#2: 私はすべてのテーブルからすべてのフィールドを取り、サンドボックス内で一つのテーブルにそれを組み合わせます。私は自分の関数を静的に(私たちが夏時間の夏にいると常に仮定するために)静的にし、サンプルデータを追加しました。できます!だから私は推測して戻っていく必要があります.SQLの構文やロジックに問題はありません。一部の列、一部の結合または表が失敗しています。また、私は断続的に、このエラーが出る:

Error | 1366 | Incorrect decimal value: '' for column '' at row -1 

私はSQLファイルを添付することができれば、私は私のテストスキーマを添付でき、私はここでそれを貼り付けする必要はありません。

+0

あなたは私たちにあなたがこれらの3行が含まれていない場合に返されるサンプルの行を表示することができますWHERE句? –

+0

サンプル行を追加しました – dlite922

+0

私が探しているものを明確にしました。サンプルの日を見ると。 eventHalfPoint(7番目の列)が8番目と最後の間にある行を探しています。したがって、これらの行はすべて返されます。 19:30は19:00〜22:00(18:00〜22:00、最後の3行を参照)です。 – dlite922

答えて

1

また、プロジェクトの作業中に少し気がつきました。

午前5時から午後1時の間のDBからのレコードをフィルタリングすることを希望しました。 クエリ文字列にAMまたはPMパラメータを渡したいとします。 しかし、mysqlのdate_formatは常に24時間形式です。 AMまたはPMは関係ありません。

select poll_voting_result_id,poll_master_id,date_voting,date_format(date_voting,'%Y-%m-%d %r') as 12_hour_format_R, 
date_format(date_voting,'%Y-%m-%d %H:%i:%s %p') as 24_hour_format_P from poll_voting_result 
where up_down = 0 
and 
poll_master_id = '11' 
and 
date(date_voting) = '2013-03-20' 
and date_format(date_voting,'%H:%i:%s %r') BETWEEN '05:00 AM' and '13:01:06 PM' 
order by date_voting ASC 


select poll_voting_result_id,poll_master_id,date_voting,date_format(date_voting,'%Y-%m-%d %r') as 12_hour_format_R, 
date_format(date_voting,'%Y-%m-%d %H:%i:%s %p') as 24_hour_format_P from poll_voting_result 
where up_down = 0 
and 
poll_master_id = '11' 
and 
date(date_voting) = '2013-03-20' 
and date_format(date_voting,'%H:%i:%s %p') BETWEEN '05:00' and '13:01:06' 
order by date_voting ASC 

上記の両方が正常に機能しています。 は、しかし、私は渡す必要が

'05 BETWEEN:00 AM「'01と:01:06 PM」

関連する問題