Je développe une application de calendrier. Il stocke des moments dans deux formats. La table a suivi des colonnes Je veux sélectionner les événements qui se produisent après une date spécifiée. L'ordinateur client fournit au serveur un horodatage UNIX du début de ce jour ( Le problème est que je ne sais pas comment sélectionner ces jours qui se produisent comme spécifié ci-dessus. Cette solution n'est pas applicable pour moi, même si cela fonctionne: P> titre, startDate, starttime code>. Si l'utilisateur fournit une date de début plus la date de début. La base de données stocke UNIX Time Time (Nombre de secondes depuis UNIX EPOK) dans la colonne StartTime CODE>, tandis que StartDate est null code>. Si l'utilisateur ne fournit qu'une date de début, la base de données stocke la date au format nnnn-mm-dd code> in startdate code> et null code> dans Â'StarTime `. J'ai cette structure de base de données, car il est plus facile d'afficher des temps dans le monde entier, car différents fuseaux horaires ont différentes fois d'économie d'été. $ unix code>) et une date ( $ DATE code>) dans le format nnnn-mm -DD code> Pour sélectionner les dates correctes. P> SELECT *
FROM events
WHERE IF(startTime = NULL, startDate >= '$date', startTime >= '$unix')
6 Réponses :
WHERE (startTime IS NULL AND startDate >= '$date') OR (startTime IS NOT NULL AND startTime >= '$unix')
@ Woho87: Vous ne pouvez jamais avoir assez NULL! ;)
@ Woho87: il n'y a pas de deux nulls. Était dans la première révision mais j'ai corrigé cette faute de frappe après 10 secondes.
Vous avez juste besoin de la logique booléenne combinée dans le où code> clause:
Êtes-vous sûr que nous avons besoin est NULL code> dans les deux cas? Si oui - pourquoi ne pas le déplacer les parenthèses.
@zerkms: différentes variables ... Je vais par mon interprétation des exigences d'affiches, qui peuvent être correctes ou non: "La" base de données stocke un timbre de l'heure UNIX (nombre de secondes depuis UNIX EPOK) dans la colonne Starttime, tandis que startdate est null. Si l'utilisateur ne fournit qu'une date de début, la base de données stocke la date au format NNNN-MM-DD dans StartDate et NULL in'starTtime`.
hehe, et j'ai essayé d'écrire ma réponse en fonction de son si code> supposition ... qui représente une logique différente: -S
Tous les dialectes SQL Dialects Support Case lorsque:
SELECT *
FROM events
WHERE CASE WHEN startTime is null
THEN startDate >= '$date'
ELSE startTime >= '$unix'
Et cela ne sera pas optimisé d'utiliser des index.
SELECT * FROM events WHERE (startDate >= '$date' OR startTime >= '$unix') AND startDate != NULL This will not return any row that has null value for startDate
! = null code> est toujours évalué à false code>
et startdate n'est pas NULL code> est ce que vous cherchez là-bas @ibu.
Je suppose que vous voulez utiliser startDate lorsque StartDate n'est pas NULL et StartTime quand StartTime n'est pas NULL ... puis essayez ceci ... Vous pouvez utiliser le Déclaration de cas également, mais cela a plus de sens est plus lisible. P> p>
Je sais que c'est une vieille question, mais je pense que c'est la meilleure façon de continuer ...
SELECT * FROM events WHERE IF(startTime IS NULL, '$date', '$unix') =< startDate