Я сейчас использую

Convert(varchar, Getdate(), 101)

Чтобы вставить только часть даты системной даты в одну из таблиц базы данных сервера sql. у меня вопрос: правильно ли это сделать или есть какой-нибудь другой способ лучше?

1
kashif 17 Мар 2013 в 13:49
Я нашел решение. Я вставлял тип данных varchar в varbinary
 – 
kashif
17 Мар 2013 в 14:02
2
Но почему вы конвертируете вывод GETDATE() в VARCHAR, когда столбец SMSDate уже является DATETIME ???? Не имеет никакого смысла .....
 – 
marc_s
17 Мар 2013 в 14:04
Благодарю. Я получал эту ошибку при вставке varchar в verbinary. и я решил свою проблему, воссоздав свою таблицу и изменив [SMS] [varbinary] (160) NOT NULL на [SMS] [varchar] (160) NOT NULL ,. но вы указали еще на одну вещь, о которой я не просил. т.е. почему вы конвертируете вывод getdate () в varchar. да я этого не заметил. что бы вы мне посоветовали для этого. как мне вставить туда системную дату вместо того, что вы указали как ошибку?
 – 
kashif
17 Мар 2013 в 14:13
2
Просто вставьте GETDATE() - это уже DATETIME - абсолютно нет необходимости и никакой выгоды в преобразовании этого в varchar (и SQL Server преобразует его обратно в DATETIME при вставке ....)
 – 
marc_s
17 Мар 2013 в 14:14
Спасибо еще раз. Я хочу, чтобы вы написали это в ответе, а не комментировали его, чтобы я был счастлив проголосовать за вас.
 – 
kashif
17 Мар 2013 в 14:17

1 ответ

Лучший ответ

Я не понимаю, почему вы конвертируете вывод GETDATE() (который уже является DATETIME) в VARCHAR, а затем SQL Server преобразует его обратно в DATETIME при вставке это снова.

Просто используйте:

INSERT INTO dbo.YourTable(SomeDateTimeColumn) 
VALUES(GETDATE())

Если вы делаете это преобразование, чтобы избавиться от временной части DATETIME, вам лучше:

  1. используйте тип данных DATE (доступен в SQL Server 2008 и новее) для хранения только DATE (некогда)
  2. если вы используете SQL Server 2005 или более раннюю версию, используйте вместо этого это преобразование - оно должно быть намного эффективнее, чем два преобразования!

    INSERT INTO dbo.YourTable(SomeDateTimeColumn) 
    VALUES(DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0))
    

Обновление: было проведено некоторое тестирование производительности, и в этом конкретном случае кажется, что объем работы, который должен выполнить SQL Server, действительно одинаков - независимо от того, используете ли вы convert to varchar удаляет время и возвращается к подходу datetime , который у вас уже есть, или используете ли вы мой подход get the number of days from date 0 . В конце концов, похоже, это не имеет значения.

Однако ЛУЧШЕЕ решение все равно будет: если вам все равно нужна только дата - используйте столбец типа DATE (в SQL Server 2008 и новее) и избавьтесь от любых преобразований или манипуляций с выводом GETDATE() в целом.

4
marc_s 17 Мар 2013 в 16:42