Это продолжает часто собирать дополнительные голоса, даже спустя несколько лет, и поэтому мне нужно обновить его для современных версий Sql Server. Для Sql Server 2008 и новее это просто:
cast(getDate() As Date)
Обратите внимание, что последние три абзаца в нижней части по-прежнему применяются, и вам часто нужно сделать шаг назад и найти способ избежать броска в первую очередь.
Но есть и другие способы сделать это. Вот самые распространенные.
Правильный путь (впервые с Sql Server 2008):
cast(getdate() As Date)
Правильный путь (старый):
dateadd(dd, datediff(dd,0, getDate()), 0)
Сейчас он старше, но все же стоит знать, потому что он также может легко адаптироваться к другим временным точкам, таким как первый момент месяца, минуты, часа или года.
Этот правильный путь использует документированные функции, которые являются частью стандарта ANSI и гарантированно работают, но это может быть несколько медленнее. Он работает, определяя, сколько дней существует с 0 до текущего дня, и добавляя это количество дней назад к 0. Он будет работать независимо от того, как хранится ваше время и дата, и независимо от того, какой у вас локаль.
Быстрый путь:
cast(floor(cast(getdate() as float)) as datetime)
Это работает, потому что столбцы даты и времени хранятся как 8-байтовые двоичные значения. Приведите их к плавающему, напишите их, чтобы удалить дробь, и временная часть значений исчезнет, когда вы вернете их назад к datetime. Это просто немного смещается без сложной логики, и это очень быстро.
Помните, что это зависит от деталей реализации, которые Microsoft может изменить в любое время, даже при автоматическом обновлении службы. Это также не очень портативный. На практике очень маловероятно, что эта реализация изменится в ближайшее время, но все же важно осознавать опасность, если вы решите ее использовать. И теперь, когда у нас есть возможность использовать дату, это редко требуется.
Неправильный путь:
cast(convert(char(11), getdate(), 113) as datetime)
Неправильный способ работает путем преобразования в строку, усечения строки и преобразования обратно в дату-время. Это неправильно по двум причинам: 1) он может работать не во всех локалях и 2) это самый медленный из возможных способов сделать это ... и не только немного; Это на порядок или два медленнее, чем другие варианты.
Обновление В последнее время за это проголосовали, и поэтому я хочу добавить к этому, что с момента публикации я увидел довольно веские доказательства того, что Sql Server оптимизирует разницу в производительности между " правильный и быстрый путь, то есть вы должны отдать предпочтение первому.
В любом случае вы хотите написать свои запросы, чтобы избежать необходимости делать это в первую очередь . Это очень редко, что вы должны сделать эту работу с базой данных.
В большинстве мест база данных уже является вашим узким местом. Как правило, это сервер, который является самым дорогим для добавления оборудования для повышения производительности, и самый сложный для правильной установки этих дополнений (например, вы должны балансировать диски с памятью). Кроме того, его сложнее масштабировать как с технической, так и с деловой точки зрения; Технически гораздо проще добавить веб-сервер или сервер приложений, чем сервер базы данных, и даже если это неверно, вы не платите $ 20 000 за серверную лицензию для IIS или apache.
Смысл, который я пытаюсь подчеркнуть, заключается в том, что по возможности вы должны выполнять эту работу на уровне приложений. только время, когда вы должны урезать дату и время на Sql Server, - это когда вам нужно сгруппировать по дням, и даже в этом случае вам, вероятно, следует установить дополнительный столбец как вычисляемый столбец, сохраняемый при вставке / время обновления или поддерживается в логике приложения. Получите эту тяжелую работу с базами данных из своей базы данных.