ADI@345 Ответов: 3

Как получить данные за последние 30 дней с сегодняшней даты в SQL server


я должен получить запись всех строк с последних 30 до сегодняшнего дня. я пробовал это, но не работает

Что я уже пробовал:

выберите дата_время от dsr_data где date_time &ГТ;= конвертировать(тип varchar(100), функция dateadd(день,-30,getdate ()) для,103) и дата_время &ЛТ;= конвертировать(тип varchar(100), getdate(),то 103)

Santosh kumar Pithani

Вы должны преобразовать столбец "date_time <= CONVERT(varchar(100), getdate(),103)" с обеих сторон в заданном состоянии.

3 Ответов

Рейтинг:
28

OriginalGriff

Зачем тебе конвертировать?
Единственная возможная причина-та же самая причина, по которой он не работает: вы храните свои даты в виде столбцов NVARCHAR вместо DATE, DATETIME или DATETIME2.

Когда вы сравниваете строки, сравнение полностью основано на первом различном символе в двух строках: и поскольку вы специально выбираете форматирование даты в формате 103, который является "ДД/ММ/гггг", сравнение будет полным мусором - например, год будет проверен последним, поэтому 31/01/2017 будет перед 31/12/1952, потому что сравнение будет основано на первой цифре месяца, а " 0 "меньше " 1".

Измените свою базу данных. Всегда храните данные в соответствующих типах данных: это означает целочисленные значения в Столбцах INT, информацию о дате в Столбцах DATE, DATETIME или DATETIME2 и т. д. Если вы этого не сделаете, это будет только первая из многих неприятных, неприятных проблем, ожидающих, чтобы укусить вас вниз по линии...


ADI@345

теперь я могу изменить тип данных nvarchar в DateTime , и с помощью этого запроса, но не работает.

выберите date_time из dsr_data, где date_time >= DATEADD(DAY,-30,GETDATE()) и
date_time <= getdate()

OriginalGriff

Я бы использовал BETWEEN, но если предположить, что ваши данные в таблице верны, ваш запрос должен работать. - это происходит, когда я запускаю его против своих данных (с измененными именами таблиц и столбцов).
Итак, начните с просмотра ваших данных: предположив, что "не сработало" означает, что он не вернул никаких строк, закомментируйте часть "и date_time...", чтобы она снова возвращала все в течение тридцати дней, и посмотрите, что вы получите.

ADI@345

здесь на datetime данные сохраняются как гггг-ММ-ДД
но в формате getdate() я получаю как гггг-ДД-ММ

CHill60

Не имеет значения, как дата дисплеи - когда он хранится как дата - время, это просто дата + время. Так что использование between все равно будет работать

ADI@345

я думал, что это проблема ...

OriginalGriff

Вот почему вы не можете хранить даты в виде NVARCHAR - когда SQL должен преобразовать их обратно, он угадает, какой это формат, и, скорее всего, ошибется, в некоторых случаях, если не во всех.
Поэтому, когда вы изменили свой столбец NVARCHAR на DATETIME, SQL должен был попытаться выяснить, что такое каждая дата.
Начните с просмотра ваших данных - пока вы не преобразуете их, они вообще не имеют информации о форматировании, они хранятся как "тики с определенного момента времени", а не годы, месяцы и дни - и получите это правильно (я бы использовал C# или VB, чтобы прочитать строку, убедиться, что она правильная, и обновить sql там, где это необходимо)

Но, глядя на ваше определение базы данных из ваших комментариев ниже, здесь есть и другие проблемы.
Не храните информацию о времени отдельно от даты и всегда храните информацию о времени в UCT, а не по местному времени - таким образом, когда местное "летнее" или "летнее" время входит или выходит, ваша БД не заполняется несогласованными данными.
Не храните "тип клиента" в виде строки, создайте вторую таблицу и используйте внешний ключ для ее индексации.
100 символов - это не очень хорошая идея для мобильных номеров или электронной почты-в одном случае она слишком велика, в другом-слишком мала!
У вас должен быть столбец ID - IDENTITY - это нормально, чтобы дать вам абсолютную ссылку на столбец, когда вам нужно его изменить. На данный момент, если клиент меняет свой мобильный телефон, как вы узнаете, какую строку обновить?

ADI@345

спасибо, сэр , за ваше предложение, я сделаю это, и я решил эту проблему ..мой код теперь работает нормально..

ADI@345

но есть ли какой-нибудь способ удалить время из datetime.

OriginalGriff

Если вам нужно, то да - кастинг его на свидание сделает это.
Но добавление времени к дате-это просто Пита, когда вам нужно использовать значение времени, особенно когда у вас есть время, хранящееся в виде NVARCHAR!

ADI@345

как получить данные между двумя датами :

пустота gvbind()
{

строка запроса = "выбрать * из [dsr_data] где date_time date_time код между '"+текстовое поле textbox1.Текст+" и дата_время '"+TextBox4.Текст+"'";
DataTable dtAdmin = новый DataTable();
SqlDataAdapter da;
da = новый SqlDataAdapter(запрос, cnn);
da.Fill(dtAdmin);
если (dtAdmin.Строк.Count > 0)
{
GVmydsr.Источник данных = dtAdmin;
Гвмыдср.Привязку();

}
еще
{
GVmydsr.Источник данных = значение null;
Гвмыдср.Привязку();
}
}

ADI@345

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

OriginalGriff

- Нет!
Никогда не делайте этого - это крайне опасно.
Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Рейтинг:
2

Santosh kumar Pithani

SELECT date_time  FROM dsr_data
    WHERE date_time
               between DATEADD(DAY,-30,GETDATE()) and  GETDATE(); 


Рейтинг:
12

Atlapure Ambrish

Используйте нижеприведенный запрос.

SELECT date_time  FROM  dsr_data
WHERE date_time  >= DATEADD(day,-30, getdate()) 
and   date_time  <= getdate()


ADI@345

я использую тот же код, но он не работает

Atlapure Ambrish

Это должно сработать, я проверил это и работает для меня. Что такое тип данных столбца date_time?

ADI@345

Создайте таблицу [dbo].[dsr_data](
[client_type] [varchar](100) NULL,
[date_time] datetime NULL,
[tme] [varchar](100) NULL,
[area] [varchar](100) NULL,
[имя_компании] [varchar](100) NULL,
[client_name] [varchar](100) NULL,
[мобильный телефон] [varchar](100) NULL,
[email] [varchar](100) NULL,
[address_name] [varchar](100) NULL,
[ориентир] [varchar](100) NULL,
[curr_presence_appoint] [varchar](100) NULL

) НА [ПЕРВИЧНОМ]