将日期字符串与 SQL Server 中的日期时间进行比较?
-
08-06-2019 - |
题
在 SQL Server 中我有一个 DATETIME
包含时间元素的列。
例子:
'14 AUG 2008 14:23:019'
是什么 最好的 只选择特定日期的记录,忽略时间部分的方法?
例子:(不安全,因为它与时间部分不匹配并且不返回任何行)
DECLARE @p_date DATETIME
SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )
SELECT *
FROM table1
WHERE column_datetime = @p_date
笔记:考虑到这个网站也是关于记下你学到然后忘记的笔记和技术的,我将发布我自己对这个问题的答案,因为 MSSQL 中的 DATETIME 内容可能是我在 SQLBOL 中查找最多的主题。
更新 澄清示例更具体。
编辑 抱歉,但我不得不修改错误的答案(返回错误结果的答案)。
@乔里特: WHERE (date>'20080813' AND date<'20080815')
将于13日和14日返回。
@wearejimbo: 接近,但没有雪茄! 徽章授予您。您错过了 14/08/2008 23:59:001 至 23:59:999 写入的记录(即距离午夜不到 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”上的任何索引(如果存在)。
其他提示
只需比较年、月和日的值即可。
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
经常, ,那么我发现的最佳解决方案是向表中添加另一个持久计算列,该列仅包含 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
那么你的搜索将会更快:
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) 返回删除了时间部分的日期时间数据类型,并且可以这样使用。
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 破坏“将日期转换为没有时间的字符串,然后再次将其转换回来”的逻辑。
它还没有公开“时间部分表示为日期的分数”的内部实现。
获取该月第一天的日期
DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0)
获取 1 年前的日期
DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))
我通常将日期时间转换为日期并比较它们,如下所示:
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
我知道这并不完全是您想要的方式,但这可能是一个开始:
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)
这会将数据时间和字符串转换为“YYYY-MM-DD”格式的 varchar。
这很丑陋,但应该有用
可以使用字符串比较在 sqlserver 中比较日期:例如
DECLARE @strDate VARCHAR(15)
SET @strDate ='07-12-2010'
SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
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
最好的方法是使用 SQL 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 中指定了多种日期格式。参考 https://msdn.microsoft.com/en-in/library/ms187928.aspx
转换 varchar 列并将其与选定日期进行比较。
句法:
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()函数传递日期值的简短字符串。样本:DateVariable.ToShortDateString();