Время отбрасывания в DateTime - PullRequest
17 голосов
/ 29 января 2009

У меня проблема с тем, что моя таблица хранит дату как

2009-01-10 10:00:00.000

и у меня есть другая таблица, в которой дата хранится как

2009-01-10 12:00:00.000

Я знаю, что они не совпадают, но даты есть, есть ли в SQL возможность легко сократить время и сохранить только даты для сравнения? Спасибо.

Ответы [ 16 ]

24 голосов
/ 29 января 2009

Запустите это

SELECT DATEADD(dd, DATEDIFF(d, 0, Getdate()), 0)

замените Getdate () на имя вашего столбца, чтобы убрать дату

Кстати, если вы проводите сравнение, лучше сделать> = и <, поскольку он будет работать лучше </p>

7 голосов
/ 22 июля 2011

Вы можете использовать этот синтаксис: -

CAST(date_field AS DATE) as column_name

6 голосов
/ 29 января 2009

Смотри здесь

Вы хотите первый.

SELECT (CAST(FLOOR(CAST(GETDATE() as FLOAT)) AS DateTime))

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

EDIT : @feihtthief - вот способ заполнить таблицу дат (с 0 разом) из таблицы временных чисел, которая является БЫСТРОЙ Отредактируйте его, чтобы сохранить таблицу чисел, если хотите. Они также удобны.

DECLARE @DaysFromGoLive int                                                                                 
SET @DaysFromGoLive = (SELECT (DATEDIFF(dd,'10/01/2007',GETDATE()) + 1)) /* Days from go live is the starting date of the table */

 SELECT TOP 10950 --30 years of days                                                                        
        IDENTITY(INT,1,1) as N                                                                              
   INTO #Numbers                                                                                            
   FROM Master.dbo.SysColumns sc1,                                                                          
        Master.dbo.SysColumns sc2                                                                           

CREATE TABLE [dbo].[TableOfDates](                                                                      
    [fld_date] [datetime] NOT NULL,                                                                           
 CONSTRAINT [PK_TableOfDates] PRIMARY KEY CLUSTERED                                                         
(                                                                                                           
    [fld_date] ASC                                                                                            
)WITH FILLFACTOR = 99 ON [PRIMARY]                                                                          
) ON [PRIMARY]                                                                                              


INSERT INTO                                                                                                 
      dbo.TableOfDates                                                                                  
SELECT                                                                                                      
      DATEADD(dd,nums.n - @DaysFromGoLive,CAST(FLOOR(CAST(GETDATE() as FLOAT)) as DateTime)) as FLD_Date    
FROM #Numbers nums                                                                                          

SELECT MIN(FLD_Date) FROM dbo.TableOfDates                                                              
SELECT MAX(FLD_Date) FROM dbo.TableOfDates                                                              

DROP TABLE #Numbers                          
4 голосов
/ 29 января 2009

Если вы используете MS SQL Server 2008, вы также можете перейти на новый тип данных DATE вместо DATETIME.

3 голосов
/ 29 января 2009

Вот один из способов:

declare @d datetime
set @d = getdate()

select dateadd(d, datediff(day, 0, @d), 0)
2 голосов
/ 30 января 2009

Преобразование в varchar медленное. Не делай этого. Решение Datediff является самым быстрым, и если вы сравниваете с датой, вам даже не нужно использовать dateadd (или поочередно конвертировать в datetime), поскольку целое число неявно сравнивается с датой без проблем, как в:

WHERE SomeDate = DateDiff(d, 0, GetDate())

Предложение Марка Бриттингема о соединении двух таблиц довольно хорошее. А для сравнения с единственной датой, как предлагается, используйте:

WHERE A.Dt >= @SomeDate AND A.Dt < @SomeDate + 1
1 голос
/ 09 сентября 2010

Функция SQL CLR должна выглядеть так:

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlDateTime StripTime(SqlDateTime date)
    {
        return date.IsNull ? SqlDateTime.Null : new SqlDateTime(date.DayTicks, 0);
    }
};
1 голос
/ 30 января 2009

В Oracle вы могли бы сделать усечение (DateTime), которое избавляет от компонента времени. (Существуют варианты, такие как trunc (DateTime, 'MONTH'), который дает первую дату месяца.) Не уверен, что это стандартный SQL, но я уверен, что в других базах данных были бы аналогичные функции.

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

1 голос
/ 30 января 2009

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

0 голосов
/ 22 августа 2011

В зависимости от вашей причины обнуления времени ...

Для меня это часто было так, чтобы я мог сравнить две даты . В этом случае вам лучше придерживаться> =, <= сравнений (избегать =, <>), если можете. Таким образом, вы можете выполнять сравнения в предложении WHERE, не теряя преимущества своего индекса.

Если вы используете SQl-Server 2008, у них теперь есть тип данных DATE (без учета времени)

Вы можете использовать некоторый творческий формат хранения - например, smallint (половина размера smalldatetime) YYDDD, где DDD - юлианская дата (каждый день года нумеруется последовательно от 1 до 365). Это меньший тип данных, действительный для>, =, <сравнений. Недостатком является необходимость преобразования внешних дат в этот формат (или наоборот) перед сравнением. </p>

Полагаю, еще одна вещь, которую стоит рассмотреть, - это предотвращение сохранения данных о времени.

Вы также можете сделать YEAR(), MONTY() и т. Д., Которые будут возвращать целочисленные значения. Может быть не лучшим для сравнения дат, но полезно для форматирования и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...