2013-12-03 2 views
0

У меня есть таблица со столбцом, который ранее был преобразован с помощьюнужно вычислить разницу дат даты сегодня против переоборудованного поля даты

(CONVERT(VARCHAR(19), GETDATE(), 112) 

С GETDATE быть датой, когда поле было вставлено. Теперь мне нужно сравнить текущую дату с датой вставки поля. Проблема, с которой я столкнулся, заключается в том, что, когда поле даты находится в прошлом месяце, скажем, 20131004, я вычисляю разницу дат на (CONVERT (VARCHAR (19), GETDATE(), 112) - 20131004, результат 200. Очевидно, это это неправильно ... Не могли бы вы предложить мне, как я могу вычислить разницу истинную дату?

+2

Почему вы не изменяете тип данных вправо ('DATE') вместо обращения к преобразованиям и из строки? Также прекратите использовать ленивую стенопись, например 'DATE1 - DATE2' (она не работает с типами данных, которые вы должны использовать с SQL Server 2008). Используйте 'DATEDIFF (DAY, column, GETDATE())'. Предполагая, что все ваши данные «хороши» (любые плохие данные могут попасть туда, когда вы используете неправильный тип данных), это должно работать без каких-либо преобразований. –

+0

спасибо, но часы - это то, что таблица не была создана мной, и у меня нет доступа к тому, как вводится дата. Мне нужно иметь дело с тем, что у меня есть ... – user2669043

ответ

0

Я согласен с @Aaron, что вы должны сохранить поле даты в поле даты , а не текстовое поле.

Если по какой-то причине вы хотите сохранить его в текстовом поле, то самый простой способ, чтобы вычислить количество дней, чтобы преобразовать его обратно в поле даты, а затем сравнить его:

SELECT DATEDIFF(DAY, CAST(column_name as DATETIME), GETDATE()) FROM dbo.table 

Этот выдает ошибку, если значение в столбце не может быть преобразовано в дату. Вам также необходимо убедиться, что дата правильно отформатирована для вашей базы данных. Предполагая, что вы используете формат 112, вы должны быть в порядке, но если у вас есть значение 04/12/2013 в колонке, то это 4 декабря 2013 года или 12 апреля 2013 года? Это зависит от того, как настроена ваша база данных.

Но в любом случае, если вы всегда вставляете даты в это поле, вы гайки, не делая это поле даты.

Если вам нужно указать дату где-нибудь, то конвертируйте ее на выход.

2
  1. вы должны использовать тип DATE или DATETIME данных для этого столбца. с какой стати вы когда-либо хранить дату в качестве строки? Знаете ли вы, сколько вы проиграли, сделав это? Валидация, для одного - столбец VARCHAR(19) примет 20131004 12:34 PM, но также примет значения бессмыслицы, такие как I am not a date!.

  2. Если данные на самом деле хорошо, вы можете просто сделать это вместо ленивого стенографии и без каких-либо явных преобразований:

    SELECT DATEDIFF(DAY, column_name, GETDATE()) FROM dbo.table; 
    

    Если вы получите сообщение об ошибке с этим, то у вас есть плохие данные. Вы можете определить это следующим образом:

    SELECT column_name FROM dbo.table WHERE ISDATE(column_name) = 0; 
    

Пожалуйста, прочитайте:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx

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