web-dev-qa-db-fra.com

Comment interroger le champ DATETIME en utilisant uniquement la date dans SQL Server?

Question simple mais je n'arrive pas encore à la résoudre ...

J'ai une table TEST avec un champ DATETIME, comme ceci:

ID NAME DATE
1 TESTING 2014-03-19 20:05:20.000

Ce dont j'ai besoin, c'est que la requête ci-dessous retourne cette ligne et toutes les lignes avec date = 03/19/2014, quelle que soit l'heure:

select * from test where date = '03/19/2014';

Mais il ne retourne pas de lignes. La seule façon de travailler est de spécifier aussi l'heure:

select * from test where date = '03/19/2014 20:03:02.000';

Merci d'avance !

59
delphirules

utiliser plage ou fonction DateDiff

 select * from test 
 where date between '03/19/2014' and '03/19/2014 23:59:59'

ou

 select * from test 
 where datediff(day, date, '03/19/2014') = 0

Les autres options sont: 

  1. Si vous avez le contrôle sur le schéma de base de données et que vous n'avez pas besoin des données de temps , Supprimez-les.

  2. ou, si vous devez le conserver, ajoutez un attribut de colonne calculé dont la partie heure de la valeur de date est supprimée ... 

Alter table Test Add DateOnly As DateAdd(day, datediff(day, 0, date), 0)

ou, dans des versions plus récentes de SQL Server ...

Alter table Test Add DateOnly As Cast(DateAdd(day, datediff(day, 0, date), 0) as Date)

alors, vous pouvez écrire votre requête simplement: 

select * from test 
where DateOnly = '03/19/2014'
82
Charles Bretana

Réponse simple;

select * from test where cast ([date] as date) = '03/19/2014';
37
kabcha

J'utilise MySQL 5.6 et une fonction DATE permet d'extraire uniquement la partie date de date heure. Donc, la solution simple à la question est -

 select * from test where DATE(date) = '2014-03-19';

http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html

17
Goku__
select * from test 
where date between '03/19/2014' and '03/19/2014 23:59:59'

C’est une réponse réelle mauvaise. Pour deux raisons.

1 . Que se passe-t-il avec des moments comme 23.59.59.700 etc . Il y a des moments plus grands que 23:59:59 et le lendemain.

2 . Le comportement dépend du type de données . La requête se comporte différemment pour les types date/heure/date/date/heure2.

Les tests effectués avec 23: 59: 59.999 aggravent encore les choses car, en fonction du type de données, vous obtenez des arrondis différents.

select convert (varchar(40),convert(date      , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime  , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime2 , '2014-03-19 23:59:59.999'))

- Pour la date, la valeur est 'hachée' .-- Pour la date et l'heure, la valeur est arrondie à la date suivante. (Valeur la plus proche) .-- Pour datetime2, la valeur est précise.

3
Ben

Essaye ça

 select * from test where Convert(varchar, date,111)= '03/19/2014'
2
Amit

tu peux essayer ça

select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';
1
HeLL

Cela fonctionne pour moi pour MS SQL Server:

select * from test
where 
year(date) = 2015
and month(date) = 10
and day(date)= 28 ;
1
Jeroen Krah

Vous pouvez utiliser cette approche qui tronque la partie temps:

select * from test
where convert(datetime,'03/19/2014',102) = DATEADD(dd, DATEDIFF(dd, 0, date), 0)
0
Rango
select *
  from invoice
 where TRUNC(created_date) <=TRUNC(to_date('04-MAR-18 15:00:00','dd-mon-yy hh24:mi:ss'));
0
PanSQL
-- Reverse the date format
-- this false:
    select * from test where date = '28/10/2015'
-- this true:
    select * from test where date = '2015/10/28'
0
Sherif Hamdy

Il y a un problème avec les dates et les langues et le moyen d'éviter cela consiste à demander des dates avec ce format AAAAMMJJ.

Ce chemin ci-dessous devrait être le plus rapide selon le lien ci-dessous. J'ai vérifié dans SQL Server 2012 et je suis d'accord avec le lien.

select * from test where date >= '20141903' AND date < DATEADD(DAY, 1, '20141903');
0
mako

Testez cette requête.

SELECT *,DATE(chat_reg_date) AS is_date,TIME(chat_reg_time) AS is_time FROM chat WHERE chat_inbox_key='$chat_key' 
                         ORDER BY is_date DESC, is_time DESC
0
Programer_saeed

Utilisez simplement ceci dans votre clause WHERE.

La partie "SubmitDate" ci-dessous est le nom de la colonne, insérez donc votre propre 

Cela renverra uniquement la partie "Année" des résultats, en omettant les minutes, etc.

Where datepart(year, SubmitDate) = '2017'
0
user8161541
select *, cast ([col1] as date) <name of the column> from test where date = 'mm/dd/yyyy'

"col1" est le nom de la colonne avec la date et l'heure
<nom de la colonne> vous pouvez changer le nom comme vous le souhaitez

0
NGoyal