2012-04-02 9 views
1

Ich verwende zwei gespeicherte Funktionen, Sie arbeiten und wenn sie in SELECT, geben sie richtige Werte zurück, aber wenn ich versuche, eine Teilmenge dieser Werte zu reduzieren, bekomme ich eine leere Ohne Warnungen eingestellt.MySQL DATE_FORMAT mit BETWEEN funktioniert nicht

Hier ist mein 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; 

Die letzten 3 Zeilen der WHERE-Klausel, wenn hinzugefügt, Null zurückgeben. Sie werden in SELECT kopiert und eingefügt und funktionieren einwandfrei.

Ich bin absolut verwirrt!

Wenn ich eine Zeichenfolge zum Vergleich verwende (d. H. ... = '19: 00 '), bekomme ich Ergebnisse. Jeder hat eine Idee, was ist los?

Bearbeiten: Beispiel Zeilen zurückgegeben, wenn die Where-Klausel nicht enthalten.

| 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: Ich nahm alle Felder aus allen Tabellen und in einer Tabelle in einer Sandbox kombiniert. Ich habe beide Funktionen statisch gemacht (um immer davon auszugehen, dass wir Sommer Sommerzeit haben) und Beispieldaten hinzugefügt. ES KLAPPT! Also muss ich zurückgehen, denke ich und es ist nichts, was mit der SQL-Syntax oder Logik falsch ist. Einige Spalten, einige Joins oder Tabellen sind fehlerhaft. Auch zeitweise diesen Fehler I:

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

Wenn ich eine SQL-Datei anhängen konnte, konnte ich mein Test-Schema anhängen, ich will nicht, dass es hier einzufügen.

+0

Können Sie uns zeigen eine Probe Zeile, die zurückgegeben wird, wenn Sie diese drei Zeilen in der nicht enthalten WHERE-Klausel? –

+0

Neue Beispielzeilen – dlite922

+0

Also Klärung, wonach ich suche. Wenn Sie einen Beispieltag betrachten. Ich suche nach Zeilen, in denen der eventHalfPoint (7. Spalte) zwischen dem 8. und letzten steht. Also sollten alle diese Zeilen zurückgegeben werden. 19:30 Uhr ist zwischen 19:00 und 22:00 Uhr (und zwischen 18:00 und 22:00 Uhr, siehe letzte 3 Zeilen). – dlite922

Antwort

1

Ich fand auch ein wenig während meiner Projekt-Sachen.

Wollte Datensätze aus DB filtern, die zwischen 5 AM bis 1 PM sind. Ich möchte, AM oder PM-Parameter in Abfragezeichenfolge übergeben. Aber mysql date_format dauert immer 24 Stunden Format. AM oder PM spielt keine Rolle.

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 

Oben Beide Abfrage funktioniert gut. Aber ich brauche

ZWISCHEN '05 weitergeben müssen: 00.00 ‚und '01: 01: 06 PM‘