Това продължава често да събира допълнителни гласове, дори няколко години по-късно, и затова трябва да го актуализирам за съвременни версии на 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-байтови двоични стойности. Прехвърлете ги така, че да плават, подземете ги, за да премахнете фракцията, а частта от стойностите от време е изчезнала, когато ги върнете обратно към дата и час. Всичко е просто малко изместено без сложна логика и е много бърз.
Имайте предвид, че това разчита на подробности за внедряването, които Microsoft може свободно да променя по всяко време, дори при автоматична актуализация на услугата. Освен това не е много преносим. На практика е много малко вероятно тази реализация да се промени скоро, но все пак е важно да сте наясно с опасността, ако решите да я използвате. И сега, когато имаме опцията да играем като дата, рядко се налага.
Грешен начин:
cast(convert(char(11), getdate(), 113) as datetime)
Грешният начин работи чрез преобразуване в низ, отрязване на низа и преобразуване обратно в дата и час. Това е грешно , поради две причини:1) може да не работи във всички локали и 2) става дума за най-бавния възможен начин да направите това... и не само малко; това е като порядък или два по-бавно от другите опции.
Актуализиране Това получи някои гласове напоследък и затова искам да добавя към него, че откакто публикувах това, видях някои доста солидни доказателства, че Sql Server ще оптимизира разликата в производителността между "правилния" и "бързия" начин, което означава, че сега трябва да предпочитате първото.
И в двата случая искате да напишете вашите заявки, за да избегнете необходимостта да правите това на първо място . Много рядко трябва да извършвате тази работа с базата данни.
На повечето места базата данни вече е вашето тесно място. По принцип сървърът е най-скъпият за добавяне на хардуер за подобряване на производителността и най-трудният за правилното прилагане на тези допълнения (трябва да балансирате дисковете с паметта, например). Освен това е най-трудно да се мащабира навън, както технически, така и от бизнес гледна точка; технически е много по-лесно да добавите уеб или сървър на приложения, отколкото сървър на база данни и дори това да е невярно, вие не плащате $20 000+ за сървърен лиценз за IIS или apache.
Опитвам се да кажа, че когато е възможно, трябва да вършите тази работа на ниво приложение. Единственият моментът, в който някога трябва да откриете, че съкращавате дата и час на Sql Server, е когато трябва да групирате по ден и дори тогава вероятно трябва да имате допълнителна колона, настроена като изчислена колона, поддържана по време на вмъкване/актуализация или поддържана в приложението логика. Извадете тази разбиваща индексите, натоварваща процесора работа от вашата база данни.