2016-03-31 3 views
1

Ich habe eine Anforderung, wo ich eine Abfrage auslösen muss, um die min from_date und max to_date abzurufen. Meine Daten sind wie folgt:Mysql: Erhalten der min und mx des Datums

+--------------------------------------+--------------------------------------+---------------------+---------------------+ 
| user_id        | point_id        |   from_date | to_date    | 
+--------------------------------------+--------------------------------------+---------------------+---------------------+ 
| 1e159ee9-0856-4ea8-88ab-4c0862f667af | c54c3bea-46e8-4377-bfa0-3a03c7abbafa | 2007-07-31 00:00:00 | 2012-04-08 00:00:00 | 
| 1e159ee9-0856-4ea8-88ab-4c0862f667af | c54c3bea-46e8-4377-bfa0-3a03c7abbafa | 2012-04-09 00:00:00 | NULL    | 
+--------------------------------------+--------------------------------------+---------------------+---------------------+ 

Allerdings, wenn ich die folgende Abfrage Feuer:

select min(from_date), max(to_date) from some_table where user_id='1e159ee9-0856-4ea8-88ab-4c0862f667af' and point_id ='c54c3bea-46e8-4377-bfa0-3a03c7abbafa' order by from_date; 
+------------------------+----------------------+ 
| min(from_date)   | max(to_date) | 
+------------------------+----------------------+ 
| 2007-07-31 00:00:00 | 2012-04-08 00:00:00 | 
+------------------------+----------------------+ 

Wie man sehen kann ich die to_date als NULL in mein Ergebnis wollen. Aber Max Funktion wird mich nicht NULL finden. Also, was ist die Alternative, die ich habe, damit ich NULL zurückbekomme? Außerdem ist die to_date-Spalte möglicherweise kein NULL. In diesem Fall brauche ich das NOT NULL-Datum. Kann mir bitte jemand helfen?

+0

'0000-00-00 00: 00: 00' könnte ein besserer Wert für eine Datetime-Spalte sein als NULL –

+0

Null wird nie das maximale Datum sein, ich verstehe dein Problem nicht. Sie können eine Koaleszenz verwenden, wenn Sie den Nullwert ersetzen möchten. –

+0

@Pekka, das ist keine Option, – Raj

Antwort

2

SQL Fiddle

MySQL 5.6 Schema Einrichtung:

CREATE TABLE some_table (
    user_id varchar(64), 
    point_id varchar(64), 
    from_date date, 
    to_date date 
); 


    INSERT INTO some_table VALUES 
    ('1e159ee9-0856-4ea8-88ab-4c0862f667af', 'c54c3bea-46e8-4377-bfa0-3a03c7abbafa', '2007-07-31 00:00:00', '2012-04-08 00:00:00'), 
    ('1e159ee9-0856-4ea8-88ab-4c0862f667af', 'c54c3bea-46e8-4377-bfa0-3a03c7abbafa', '2012-04-09 00:00:00', NULL); 

Abfrage 1:

select min(from_date), 
case when MAX(to_date IS NULL) = 0 THEN max(to_date) END AS max_to_date 
from some_table 
where user_id='1e159ee9-0856-4ea8-88ab-4c0862f667af' 
    and point_id ='c54c3bea-46e8-4377-bfa0-3a03c7abbafa' 

Results:

|   min(from_date) | max_to_date | 
|------------------------|-------------| 
| July, 31 2007 00:00:00 |  (null) | 

Einige Erklärung:

1- (to_date IS NULL) return 1 oder 0

2- MAX (to_date IS NULL) den Wert von Null annehmen, wenn sie existieren

3- MAX (NULL) = NULL, wenn es nicht der Fall war, sollten Sie eine ELSE in Ihrer CASE setzen/wENN

+0

Sie können es in einem if - MAX tun (if (to_date ist null, '9999-12-31 23: 59: 59, to_date)). –

+0

@Jean, diese Abfrage gibt mir immer noch die '2012-04-08 00:00:00' für die to_date Spalte statt NULL – Raj

+0

Ich habe meine Antwort bearbeitet, diese ist getestet und wird funktionieren;) –

0

Versuchen:

SELECT 
    `der`.`min_from_date` `min(from_date)`, 
    IF(`der`.`nulls` > 0, NULL, `der`.`max_to_date`) `max(to_date)` 
FROM (
    SELECT 
    MIN(`from_date`) `min_from_date`, 
    MAX(`to_date`) `max_to_date`, 
    SUM(IF(`to_date` IS NULL, 1, 0)) `nulls` 
    FROM 
    `some_table` 
    WHERE 
    `user_id` = '1e159ee9-0856-4ea8-88ab-4c0862f667af' AND 
    `point_id` = 'c54c3bea-46e8-4377-bfa0-3a03c7abbafa' 
    /*ORDER BY 
    `from_date`*/ 
) `der`; 
Verwandte Themen