Sql запрос с текущей датой - PullRequest
       0

Sql запрос с текущей датой

4 голосов
/ 14 февраля 2012

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

var query = @"
    SELECT trainid, trainnum
    FROM trains 
    WHERE CONVERT(varchar(10), trainstartdate, 104)=" + 
    " " + 
    // so that matches the '104' format
    String.Format("{0:dd.MM.YYYY}", DateTime.Now) +                          
    " " +
    "ORDER BY trainnum";

Но при запуске я получаю сообщение об ошибке:

Cannot call methods on numeric. .Net SqlClient Data Provider

Как правильно указать текущую дату? Спасибо!

Использование GETDATE ()

Эффект: The conversion of a varchar data type to a datetime data type resulted in an out-of-range value

Использование {0: дд.мм.гггг}

Эффект: none

Использование CONVERT (varchar (20), GetDate (), 104)

Эффект: that works!

Спасибо!

Ответы [ 7 ]

9 голосов
/ 14 февраля 2012

Описание

Я бы не стал конвертировать в varchar и делать сравнение строк.Производительность намного лучше, если вы сравните trainstartdate, используя >= и <.

. Вы можете использовать метод T-SQL getDate(), чтобы получить текущую дату.

getDate () возвращает текущую дату и время вместе со временем.2012-02-14 14:51:08.350

DATEADD (дд, 0, DATEDIFF (дд, 0, GETDATE ())) возвращает только текущую дату.`2012-02-14 00: 00: 00.000

DATEADD (dd, 1, DATEDIFF (dd, 0, GETDATE ())) возвращает только дату завтрашнего дня.2012-02-15 00:00:00.000

Образец

var query = @"
SELECT trainid, trainnum
FROM trains 
WHERE trainstartdate >=
-- today
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 
AND trainstartdate < 
-- tommorow
DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE()))
ORDER BY trainnum"

Примечание: Если вы хотите быть совместимым с ANSI, CURRENT_TIMESTAMP делает то же самое.

Дополнительная информация

2 голосов
/ 14 февраля 2012
var query = @"
SELECT trainid, trainnum
FROM trains 
WHERE CONVERT(varchar(10), trainstartdate, 104)=
CONVERT(varchar(20), GetDate(), 104)
ORDER BY trainnum";
2 голосов
/ 14 февраля 2012

Я думаю,

String.Format("{0:dd.MM.YYYY}", DateTime.Now);

возвращает дату с точкой, что заставляет SQL рассматривать ее как число.

Попробуйте использовать

String.Format("{0:MM/dd/yyyy}", DateTime.Now);

с/ вместо.

2 голосов
/ 14 февраля 2012

GETDATE () - это все, что вам нужно ...

1 голос
/ 14 февраля 2012

Вы должны знать, что GETDATE () возвращает текущую дату и время дня, а не только сегодняшнюю дату.

Если вы хотите вернуть строки, соответствующие сегодняшней дате, вам нужно извлечь часть даты.Есть несколько способов сделать это - например, в SQL Server 2008 вы можете использовать тип данных DATE, но один общий способ, который работает с более ранними версиями SQL Server, заключается в следующем:

CONVERT(DATETIME, convert(VARCHAR(10),getdate(),101) )

Затем вы можете использовать запрос:

SELECT trainid, trainnum   
FROM trains    
WHERE trainstartdate = CONVERT(DATETIME, convert(VARCHAR(10),getdate(),101) )

, который будет работать при условии, что вы уверены, что дата / время в столбце train.trainstartdate является только датой (время дня = 0).

Если trainstartdate содержит дату / время начала, вы можете получить все сегодняшние поезда следующим образом:

SELECT trainid, trainnum   
FROM trains    
WHERE trainstartdate >= CONVERT(DATETIME, convert(VARCHAR(10),getdate(),101) )
AND trainstartdate < DATEADD(dd,1, CONVERT(DATETIME, convert(VARCHAR(10),getdate(),101) ))

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

1 голос
/ 14 февраля 2012

Изменить шаблон формата YYYY на строчные буквы

{0:dd.MM.yyyy}
0 голосов
/ 14 февраля 2012

Попробуйте это .. YYYY должно быть маленькой буквой yyyy

String.Format("{0:dd.MM.yyyy}", DateTime.Now)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...