2016-04-29 2 views
1

J'ai une table avec un champ datetimeoffset qui est la clé primaire. Je veux filtrer ma table avec un datetime.SELECT un champ datetimeoffset par datetime

Par exemple ma table a:

2016-04-27 23:30:00.7684500 +03:00 
2016-04-28 00:30:00.7684500 +03:00 

En format de l'heure locale, première ligne signifie 29/04/2016 02:30:00 et deuxième rangée signifie 28/04/2016 03:30:00. Je veux dire deux d'entre eux en date: 2016-04-28.

Lorsque je voulais signaler des transactions en date du 28 avril 2016, je ne reçois que la deuxième ligne. Car, sql regarde l'heure UTC dans le champ datetimeoffset

declare @fromDate datetime 
select @fromDate = '2016-04-28 00:00:00' 
select * from MYTABLE where dto > @fromDate 

je peux obtenir ce que je veux vraiment comme ça:

declare @fromDate datetime 
select @fromDate = '2016-04-28 00:00:00' 
select * from MYTABLE where CAST(dto as datetime) > @fromDate 

première et deuxième rangées arrivantes.

La question est de savoir si j'ai perdu des performances pour le casting? Système regardant et coulant chaque rangée (lecture séquentielle), même si dto est la clé primaire?

Y a-t-il un meilleur moyen?

Un grand merci ...

+0

Tag les DBMS utilisés. (Ce code ne ressemble pas à ANSI SQL ...) – jarlh

+0

Merci. C'est MS SQL Server 2014. –

Répondre

0

Absolument ... Je recommande l'ajout d'un champ calculé à la table. De cette façon, la conversion se fait automatiquement en SQL et CAST ou CONVERT n'est pas nécessaire dans la requête. Effectuez une recherche sur champ calculé et insérez votre code

CONVERT(DATETIME, dto, 109) 

ou

TRY_CONVERT(DATETIME, dto, 109) 

J'utiliser TRY_CONVERT que vous pouvez définir spécifiquement le format du DateTime pour votre nouveau champ calculé et si pour une raison quelconque, dto n'est pas une date valide, elle insérera NULL au lieu d'échouer.

1

Si votre décalage (3) est une constante, vous pouvez essayer ceci:

declare @fromDate datetime 
select @fromDate = '2016-04-28 00:00:00' 
select * from MYTABLE where dateadd(hour, 3, dto) > @fromDate 

Ou vous pouvez utiliser TODATETIMEOFFSET

comme suit:

select * from MYTABLE where TODATETIMEOFFSET(dto, '03:00') > @fromDate