У меня есть две таблицы с датами, к которым я хочу присоединиться с помощью ВНУТРЕННЕГО СОЕДИНЕНИЯ. Эти таблицы связаны друг с другом с помощью FK, который гарантирует, что запись в Табле A и связанная с ней запись в Таблице B относятся к одному и тому же году.
Короче говоря, я хочу убедиться, что две даты приходятся на один и тот же месяц. как объяснено, DATEDIFF() не имеет логического преимущества в моем случае - он никогда не даст мне -12 или 12, потому что год не имеет отношения к уравнению. Мои результаты всегда будут одинаковыми как с DATEDIFF, так и с MONTH (конечно, я проверял).
При таких предположениях - что было бы эффективнее?
SELECT ....
FROM DatesA da
INNER JOIN DatesB db
ON MONTH(da.Date) = MONTH(db.Date)
AND [Rest of the join]
SELECT ....
FROM DatesA da
INNER JOIN DatesB db
ON DATEDIFF(MM, da.Date, db.Date) = 0
AND [Rest of the join]
Спасибо!
SELECT
мог дать странные результаты при работе с датами более чем за один год. - person R. Richards   schedule 16.02.2017MONTH() AND [some of the rest of the join, such as YEAR()]
с производительностьюDATEDIFF()
. - person GSerg   schedule 16.02.2017datediff()
будет быстрее и удобнее, не более того. - person GSerg   schedule 16.02.2017select datediff(MM, '2015-07-01', '2017-07-01') MonthsBetween
возвращает24
; не0
. Таким образом, эта проверка будет проверять, совпадают ли ваши даты с одним и тем же месяцем и одним и тем же годом. - person JohnLBevan   schedule 16.02.2017datediff(MM,da.date,db.date)=0
сmonth(da.date) = month(db.date) and year(da.date) = year(db.date)
; т. е. не только с выполнением одной только функцииmonth
. - person JohnLBevan   schedule 16.02.2017datediff
иmonth
; Я могу добавить другой вариант; вместоmonth
попробуйтеdatepart(month,...)
: dba.stackexchange.com/questions/17956/ - person JohnLBevan   schedule 16.02.2017datediff()
более поддается анализу? - person Horaciux   schedule 16.02.2017datediff()
прекрасно использует индексы. Глядя на различные сообщения здесь о том, что это не подлежит обсуждению, я бы предположил, что это может быть как-то связано с тем фактом, что обычно я использую его какwhere datediff(d, date1, date2) = 0
, и эта комбинация (d
,= 0
) подлежит обсуждению. Или, может быть, это просто часть= 0
. - person GSerg   schedule 16.02.2017