当我在数据库(MS SQL Server 2008 R2)中运行以下查询
时SELECT
FullName
FirstName,
LastName,
BirthDate
FROM ClientDetails
WHERE
convert(datetime, BirthDate) = Convert(datetime, '1962/06/16')
当我使用此查询组合FirstName
和LastName
进行搜索时,我没有从数据库中获得任何结果但是
SELECT
FullName
FirstName,
LastName,
BirthDate
FROM ClientDetails
WHERE FirstName = 'F' AND LastName = 'Paro'
我得到以下结果:
"V Vusumzi" "Mtim" "***1962-06-15 22:00:00.000***"
在可以查看此记录的应用程序中,日期显示为:"1962/06/16"
问题是,为什么日期不同? 实际上,所有记录在日期的某一部分都有一位数差异。
答案 0 :(得分:1)
由于Convert(datetime, '1962/06/16')
被隐式转换为午夜,1962-06-16 00:00:00
与1962-06-15 22:00:00.000
的日期时间不同。
如果您不关心时间部分,只想比较将谓词两边转换为DATE
的日期:
WHERE CONVERT(DATE, BirthDate) = CONVERT(DATE, '1962-06-16')
如果您关心时间部分,那么您的查询将按预期工作。
N.B。在使用日期文字时,请谨慎使用特定于文化的格式,例如
SELECT CONVERT(DATETIME, '1962/06/16')
可能对你有用,但区域设置不同的人可能会收到无效的演员表,例如
SET DATEFORMAT DMY;
SELECT CONVERT(DATETIME, '1962/06/16');
会抛出错误。使用DATETIME
yyyyMMdd
是 ONLY 文化不变日期时间格式时,使用DATE
yyyy-MM-dd
时也可以使用。
修改强>
只有在创建this SQL Fiddle来演示迄今为止的投射方法时,我才注意到在您的示例中,您要搜索的日期是1962年6月16日,但您要查找的记录是1962年6月15日。无论你做了多少演员和转换,6月15日永远不会是第16届,无论何时何地。