webForumDet fria alternativet

Sql med datum

5 svar · 466 visningar · startad av Qimen

QimenMedlem sedan juni 20013 568 inlägg
#1

Hej,

Sitter med en sql som visserligen fungerar men kanske inte är så speciellt optimerad. Nu behöver jag ändra en sak i den och får inte till det. Jag använder mysql 5.

Har ett datetime-fält i min tabell. Det jag försöker göra är att hämta alla poster vars datum är från 80 dagar till 89 dagar gamla. Innan hade jag bara en fråga och då gick det bra med att plocka ut alla som var 80 dagar och äldre. Men nu har jag 3 frågor som ska ta hand om ett steg var. Dvs. 80-89, 90-179 och 180+.

SELECT s_username
FROM tbl_users
WHERE (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(if(date_check = '0000-00-00 00:00:00', 
date_log, date_check)) > (80*24*60*60));

Har försökt använda between lite men inte riktigt lyckats. Kanske kan man lösa det så att man tar dagens datum minus övre/lägre gränsen och på så sätt får ut en liten lucka där. Mitt datetimefält heter date_check men om det fältet är "0000-00-00 00:00:00", så ska fältet date_log användas istället.

SELECT s_username
FROM tbl_users
WHERE if(date_check = '0000-00-00 00:00:00', date_log, date_check) 
BETWEEN subdate(now(), 100) 
AND subdate(now(), 90);

När en användare blir 80 dagar gammal så ska ett varningsmail skickas, vid 90 inaktiveras användaren och vid 180 dagar ska användaren tas bort helt. Därav min fråga. Hur ska jag lösa detta på bästa sätt? :)

@ndersMedlem sedan juni 200026 914 inlägg
#2

Flyttas från Databashanterare.

mvh

LarsGMedlem sedan dec. 200012 465 inlägg
#3

Varför tre frågor?

SELECT s_username,
           datediff(current_date,date_check) as days
  from 
  (select s_username, 
  case when date_check = '0000-00-00 00:00:00' then date_log
       else date_check end as date_check
FROM tbl_users) dt
WHERE date_check < subdate(current_date,80)

sen kan du i din applikation titta på värdet days och göra de olika saker du vill.

Varför använder du inte null istället för att lagra '0000-00-00 00:00:00'?

QimenMedlem sedan juni 20013 568 inlägg
#4

Har ändrat nu så att date_check kan vara null och är null som standard.
Du frågar varför tre frågor, jadu går det att trycka ihop det till en och samtidigt få ut resultatet så varför inte. :)

sql = plocka ut alla som är äldre än 80 dagar och upp till 90
loop ( skriv ut resultatet, gör mina saker )

sql = plocka ut alla som är ändre än 90 dagar och upp till 180
loop ( samma sak här )

sql = plocka ut alla som är äldre än 180 dagar.
loop ( samma sak här )

Jag förstår bara inte hur jag ska plocka ut datan när man trycker ihop det till en fråga. Hittils har jag kört en while-sats med mysql_fetch_row. :q
Den frågan du har gjort, vad exakt innehåller days?

LarsGMedlem sedan dec. 200012 465 inlägg
#5

datediff returnerar antalet dagar mellan två datum. Resultatet av min fråga borde bli

s_username days
------------ ----
Qimen 92
LarsG 212

så du behöver fortfarande en while och så en

  if ( $row['days'] < 90) 
  {
  // gör något
  } 
  else if ( $row['days'] < 180) 
 {
  // gör något annat
 }
  else  // > 180
 {
  // 
 }

ungefär. Med reservation för bristande php-kunskap. Om du lagrar null så kan du byta ut case-uttrycket mot funktion coalesce.

QimenMedlem sedan juni 20013 568 inlägg
#6

Tack för hjälpen LarsG, fungerar utmärkt nu. :)

Genererad på 379 ms · cache AV · v20260730165559-full.f96bc7eb