如何在SQL中按日期过滤

时间:2016-06-05 21:08:49

标签: sql date

我正在做一个SQL问题,我需要找出多少个单位' 2008年,一些音乐商店出售了最畅销的音乐类型。有很多表,但到目前为止,我能够将我需要的大部分信息串在一起。

select 
    music_store.invoice_lines.invoice_id, 
    music_store.invoice_lines.track_id, 
    music_store.invoice_lines.quantity, 
    music_store.invoices.invoice_date, 
    music_store.invoices.id, 
    music_store.tracks.genre_id
from 
    music_store.invoice_lines
inner join
    music_store.invoices on music_store.invoice_lines.invoice_id = music_store.invoices.id
inner join
   music_store.tracks on music_store.tracks.id = music_store.invoice_lines.track_id;

从这里开始,我需要过滤掉2008年未结束的所有发票日期,然后找到music_store.tracks.genre_id的模式,找到相应的类型(这是另一个表),然后汇总所有"数量"值。

我该怎么做?我很迷失,也是SQL的绝对初学者,或者或多或少是初学者。

编辑:我不知道我使用的是什么DBMS,可能是最标准的SQL版本?我在Wagon fwiw上运行SQL

2 个答案:

答案 0 :(得分:1)

在不知道您正在使用的特定RDBMS的情况下,SQL代码看起来像这样,以获得genre_id的模式。然后,您可以加入流派表格以获取流派名称。希望这会有所帮助。

select music_store.tracks.genre_id, COUNT(1) genre_count
from music_store.invoice_lines

INNER JOIN music_store.invoices
on music_store.invoice_lines.invoice_id = music_store.invoices.id
INNER JOIN music_store.tracks 
on music_store.tracks.id = music_store.invoice_lines.track_id

WHERE YEAR(music_store.invoices.invoice_date) = 2008
GROUP BY music_store.tracks.genre_id
ORDER BY genre_count DESC 
LIMIT 1;

答案 1 :(得分:1)

最通用的,可能性能最好的(“sargable”)方法是简单地指定2个日期,然后在这些日期设置的边界内选择记录。

  WHERE invoices.invoice_date >= '2008-01-01'
  AND invoices.invoice_date < '2009-01-01'

使用&gt; = with&lt;是故意的,它允许被评估的列具有任何时间单位精度。另外,通过避免数据上的函数,dbms可以使用日期列上的索引,同时避免计算每个函数。

由于您没有指定使用哪个dbms,因此我无法预测您需要如何指定这些日期文字。你可以使用to_date()或str_to_date()作为例子

的MySQL

  WHERE invoices.invoice_date >= str_to_date('2008-01-01','%Y-%m-%d')
  AND invoices.invoice_date < str_to_date('2009-01-01','%Y-%m-%d')

的Oracle

  WHERE invoices.invoice_date >= to_date('2008-01-01','yyyy-mm-dd')
  AND invoices.invoice_date < to_date('2009-01-01','yyyy-mm-dd')

T-SQL

  WHERE invoices.invoice_date >= '20080101'
  AND invoices.invoice_date < '20090101'

请注意,列invoices.invoice_date的实际数据类型将影响适用的函数,并且我假设此列不是看起来像日期/时间值的字符串。