2011-08-12 5 views
1

J'essaie de convertir la date au format String en date sql et en fonction de cette base de données de requête pour obtenir le résultat. Date au format de la chaîne est: 2011-08-11 09:16:00.0 Je suis en train de convertir à jour sql en utilisant la méthode:Problème avec la conversion de chaîne à date

public static convertStringToSqlDate(String dateString){ 
    DateFormat formater = new SimpleDateFormat("yyyy-MM-dd"); 
    java.util.Date parsedUtilDate = formater.parse(dateString); 
    java.sql.Date sqlDate= new java.sql.Date(parsedUtilDate.getTime()); 
    return sqlDate; 
} 

La date résultante est: 2011-08-11

mais tout en faisant la requête que je suis ne pas obtenir la sortie désirée

Le code complet est

def startDate = params. startDate 
def endDate = params. endDate 
def formattedTripStartDate =Trip.convertStringToSqlDate(startDate); 
def formattedTripEndDate =Trip.convertStringToSqlDte(endDate); 
def listOfContracts = Rule.findAll("FROM Rule WHERE name LIKE ? AND client_id = ? AND STR_TO_DATE(contract_begins,'%Y-%m-%d')<= ? AND STR_TO_DATE(contract_terminates,'%Y-%m-%d')>= ?",["%"+q_param+"%",clientId,formattedTripStartDate,formattedTripEndDate]) 

Où vais-je tort?

Dans la base de données les contract_begins sont stockées comme: 2011-08-23 00:00:00

Classe de domaine du contrat est

class Contract extends Rule { 

Date contractBegins 
Date contractTerminates 
int  runningDays 
Double contractValue 
Double estimatedRevenue 
Double actualRevenue 
static constraints = { 
    contractBegins(nullable:true) 
    contractTerminates(nullable:true) 
    runningDays(nullable:true) 
    contractValue(nullable:true) 
    estimatedRevenue(nullable:true) 
    actualRevenue(nullable:true) 
} 
    } 
+2

« Sting » est une rock star vieillissante. Vous voulez probablement dire "String" ... –

+3

pourquoi stocker la date comme chaîne dans DB –

+1

comme Jigar Joshi a dit, vous devriez stocker des dates comme dates dans votre DB – njzk2

Répondre

0

objet Date n'a pas le format par lui-même, il date de retour seulement et la valeur du temps. vous pouvez obtenir le formaté uniquement par format pris en charge la classe dans le format de chaîne comme SimpleDateFormat, DateFormat etc.

0

Pourquoi souhaitez-vous utiliser une requête findAll et non un critère. Quelque chose comme ça devrait le faire:

def startDate = params.startDate 
def endDate = params.endDate 
def tripStartDate=Trip.convertStringToSqlDate(startDate); 
def eripEndDate=Trip.convertStringToSqlDte(endDate); 

def c = Contract.createCriteria() 
def results = c.list { 
    like("name", "%${q_param}%") 
    eq("client_id", clientId) 
    ge('contract_begins', tripStartDate) 
    le('contract_terminates','tripEndDate) 
} 

Il est beaucoup plus propre et vous n'avez pas à vous soucier de la façon dont le SQL ressemble! Faites un plongeon profond dans http://grails.org/doc/latest/ref/Domain%20Classes/createCriteria.html et http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20(GORM).html#5.4.2 Critères où vous pouvez trouver beaucoup plus d'informations.

Pensez également à faire votre code encore plus agréable en ajoutant les critères dans la classe de domaine nommé requêtes: http://grails.org/doc/latest/ref/Domain%20Classes/namedQueries.html

+0

son erreur de donner: – Hussy

+0

groovy.lang.MissingMethodException: Aucune signature de la méthode: com.springpeople.steer.trips.TripController.after() est applicable pour l'argument types: (java.lang.String, java.sql.Date) valeurs: [contrat_begins, 2011-08-12] – Hussy

+0

J'ai corrigé le code - n'ai pas essayé si cela fonctionne, mais il pourrait :-) – sbglasius

Questions connexes