2016-09-07 3 views
0
IF('08/30/2015'>'08/29/2016') 
SELECT '1' 
ELSE 
SELECT '0' 

Этот оператор SQL возвращает 1, потому что он сравнивает только месяц и день и игнорирует год. Я знаю, что сравниваю два значения varchar - а не даты, - но я хочу знать, какая логика SQL следует для этого сравнения?Дата сравнения в формате varchar

Может ли кто-нибудь помочь мне, пожалуйста? Этот же сценарий дал мне проблему в проекте, и я исправил это, выполнив на сегодняшний день. Однако я хочу знать логику этого. Я искал его, но не нашел правильного объяснения.

+2

Он сравнивает их как строки, естественно. Он сравнивает их по характеру, первый отличается от 3 против 2, 3 больше 2, поэтому результат равен 1. –

ответ

0

Это сравнение двух символьных строк, поэтому, хотя человек будет смотреть на них и думать о датах, SQL просто видит, что одна строка символов больше другой. Если вы вытащите косые черты и просто поместите там цифры, это может иметь смысл: 08302015 > 08292016.

+0

Это не сработает, потому что оно будет сортироваться в течение месяца и дня до года (т. Е. В ваш пример, 2015 не намного больше 2016 года, не так ли?) – Ben

+0

@Ben Я не предлагаю это как расчет, а скорее отвечаю на его вопрос о том, как работает логика при сравнении представленных значений. Он уже заявил, что он правильно определил дату для кастинга, и вопрос в том, почему строки были рассчитаны так, как они делали. Взятие косой черты может сделать это более ясным для человека, и именно это я пытался связаться. Может быть, вы должны внимательно прочитать вопрос. – morgb

+0

К сожалению. Виноват. SO не позволит мне удалить мой downvote. Извини за это. – Ben

4

Ваши ценности - это не даты. Это струны. Вы можете сделать:

IF (convert(date, '08/30/2015') > convert(date, '08/29/2016')) 
    SELECT '1' 
ELSE 
    SELECT '0'; 

(Примечание. Так или иначе это работает, может зависеть от параметров интернационализационных для формата даты я предполагаю, что настроен понимать формат МДГ.)

Но зачем? Просто используйте форматы ISO стандарт Дата (YYYY-MM-DD):

IF ('2015-08-30' > '2015-08-29') 
    SELECT '1' 
ELSE 
    SELECT '0'; 

Они не нужны преобразования, поскольку строки сравнить правильно.

Смежные вопросы