在SQL Server中比较datestring和date时间?
在SQL Server中,我有一个包含时间元素的DATETIME
列。
例:
'14 AUG 2008 14:23:019'
什么是最好的方法,只select特定的一天的logging,忽略时间部分?
示例:(不安全,因为它不匹配时间部分并且不返回任何行)
DECLARE @p_date DATETIME SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 ) SELECT * FROM table1 WHERE column_datetime = @p_date
注意:鉴于这个网站也是logging笔记和技术,你拿起,然后忘记,我要发布我自己的答案这个问题作为date时间在MSSQL中的东西可能是我在SQLBOL查找最多的话题。
更新澄清的例子更具体。
编辑对不起,但我不得不下降错误的答案(回答错误的结果)。
@Jorrit:在WHERE (date>'20080813' AND date<'20080815')
将返回13日和14日。
@wearejimbo: closures,但没有雪茄! 徽章授予你。 您错过了14/08/2008 23:59:001至23:59:999(即午夜前不到1秒)的logging。
技术1:
DECLARE @p_date DATETIME SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 ) SELECT * FROM table1 WHERE column_datetime >= @p_date AND column_datetime < DATEADD(d, 1, @p_date)
这样做的好处是,如果它存在,它将使用'column_datetime'上的任何索引。
在SQL Server 2008中,您可以使用新的DATE数据types
DECLARE @pDate DATE='2008-08-14' SELECT colA, colB FROM table1 WHERE convert(date, colDateTime) = @pDate
@Guy。 我想你会发现这个解决scheme的规模很好。 查看原始查询的查询执行计划 。
对我而言 :
只是比较年,月和日的价值。
Declare @DateToSearch DateTime Set @DateToSearch = '14 AUG 2008' SELECT * FROM table1 WHERE Year(column_datetime) = Year(@DateToSearch) AND Month(column_datetime) = Month(@DateToSearch) AND Day(column_datetime) = Day(@DateToSearch)
像这样的东西?
SELECT * FROM table1 WHERE convert(varchar, column_datetime, 111) = '2008/08/14'
技术2:
DECLARE @p_date DATETIME SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 ) SELECT * FROM table1 WHERE DATEDIFF( d, column_datetime, @p_date ) = 0
如果column_datetime字段没有被索引,并且不太可能(或者索引不太可能被使用),那么使用DATEDIFF()会更短。
你接受的答案中的索引好点。
不过,如果你真的只在特定的DATE
或DATE ranges
search,那么我发现的最佳解决scheme是将另一个持久计算列添加到只包含DATE
表中,并在该列上添加索引:
ALTER TABLE "table1" ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED
在该列上添加索引:
CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci" ON "table1" ( "column_date" ASC ) GO
那么你的search会更快:
DECLARE @p_date DATE SET @p_date = CONVERT( DATE, '14 AUG 2008', 106 ) SELECT * FROM table1 WHERE column_date = @p_date
这个函数Cast(Floor(Cast(GetDate()As Float))As DateTime)返回一个datetime数据types,其中的时间部分被删除,可以这样使用。
Select * Table1 Where Cast(Floor(Cast(Column_DateTime As Float)) As DateTime) = '14-AUG-2008'
要么
DECLARE @p_date DATETIME SET @p_date = Cast('14 AUG 2008' as DateTime) SELECT * FROM table1 WHERE Cast(Floor(Cast(column_datetime As Float)) As DateTime) = @p_date
如何获取MS SQL Server中DATETIME字段的DATE部分:
最快最好的方法之一就是使用
DATEADD(dd, DATEDIFF( dd, 0, @DAY ), 0)
它避免了CPU把“把date转换成一个没有时间的string再转换回来”的逻辑。
它也没有公开内部实现的“时间部分表示为分数”的date。
获取当月的第一天的date
DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0)
1年前获得daterfom
DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))
我通常将date时间转换为date并进行比较,如下所示:
SELECT 'Same Date' WHERE CAST(getDate() as date) = cast('2/24/2012 2:23 PM' as date)
要么
SELECT 'Same Date' WHERE DATEDIFF(dd, cast(getDate() as date), cast('2/24/2012 2:23 PM' as date)) = 0
DECLARE @Dat SELECT * FROM Jai WHERE CONVERT(VARCHAR(2),DATEPART("dd",Date)) +'/'+ CONVERT(VARCHAR(2),DATEPART("mm",Date)) +'/'+ CONVERT(VARCHAR(4), DATEPART("yy",Date)) = @Dat
我知道这不完全是你想要做的,但这可能是一个开始:
SELECT * FROM (SELECT *, DATEPART(yy, column_dateTime) as Year, DATEPART(mm, column_dateTime) as Month, DATEPART(dd, column_dateTime) as Day FROM table1) WHERE Year = '2008' AND Month = '8' AND Day = '14'
SELECT * FROM table1 WHERE CONVERT(varchar(10),columnDatetime,121) = CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)
这将把数据时间和string转换成“YYYY-MM-DD”格式的variables。
这是非常丑陋的,但应该工作
date可以在sqlserver中使用string比较进行比较:例如
DECLARE @strDate VARCHAR(15) SET @strDate ='07-12-2010' SELECT * FROM table WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
最好的方法是使用SQL DATE()函数简单地提取date部分:
SELECT * FROM table1 WHERE DATE(column_datetime) = @p_date;
SELECT * FROM tablename WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp
SQL中有很多date格式正在被指定。 请参阅https://msdn.microsoft.com/en-in/library/ms187928.aspx
转换和比较varchar列与选定的date。
句法:
SELECT * FROM tablename where CONVERT(datetime,columnname,103) between '2016-03-01' and '2016-03-03'
In CONVERT(DATETIME,COLUMNNAME,103) "103" SPECIFIES THE DATE FORMAT as dd/mm/yyyy
在sqlserver中
DECLARE @p_date DATE SELECT * FROM table1 WHERE column_dateTime=@p_date
在C#中使用ToShortDateString()函数传递date值的短string。 示例:DateVariable.ToShortDateString();