系统与数据库之间显示dateofbirth字段的差异

时间:2014-07-21 14:41:06

标签: sql-server datetime sql-server-2008-r2

当我在数据库(MS SQL Server 2008 R2)中运行以下查询

SELECT
    FullName 
    FirstName, 
    LastName,
    BirthDate 
FROM ClientDetails
WHERE
convert(datetime, BirthDate) = Convert(datetime, '1962/06/16')

当我使用此查询组合FirstNameLastName进行搜索时,我没有从数据库中获得任何结果但是

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"

问题是,为什么日期不同? 实际上,所有记录在日期的某一部分都有一位数差异。

1 个答案:

答案 0 :(得分:1)

由于Convert(datetime, '1962/06/16')被隐式转换为午夜,1962-06-16 00:00:001962-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届,无论何时何地。