SQL Server日期时间和SQL

SQL Server日期时间和SQL,sql,sql-server,Sql,Sql Server,我在下面的简单查询中遇到问题 SELECT * FROM users WHERE Created = '28/02/2013' 问题在于创建的列是datetime数据类型,因此只要时间戳为0:00:0,查询就会正常执行,如果时间戳设置为12:00,则查询不会返回结果集 知道为什么吗 谢谢 将修复它,但请小心,它会禁用索引 SELECT * FROM users WHERE Created BETWEEN '28/02/2013 00:00' AND '28/02/2013 23:59' 这将

我在下面的简单查询中遇到问题

SELECT * FROM users WHERE Created = '28/02/2013'
问题在于创建的列是datetime数据类型,因此只要时间戳为0:00:0,查询就会正常执行,如果时间戳设置为12:00,则查询不会返回结果集

知道为什么吗

谢谢

将修复它,但请小心,它会禁用索引

SELECT * FROM users WHERE Created BETWEEN '28/02/2013 00:00' AND '28/02/2013 23:59'
这将使用索引

将修复它,但请小心,它会禁用索引

SELECT * FROM users WHERE Created BETWEEN '28/02/2013 00:00' AND '28/02/2013 23:59'

这将使用索引,您必须将列转换为日期,然后进行比较

SELECT * FROM users WHERE CONVERT(VARCHAR(11), Created, 106) = '28 Feb 2013'

您必须将列转换为日期,然后进行比较

SELECT * FROM users WHERE CONVERT(VARCHAR(11), Created, 106) = '28 Feb 2013'

因为您没有指定时间,所以它假定您正在执行以下操作:

SELECT * FROM users WHERE Created = '28/02/2013 00:00:00'
如果你想要一整天,那么你需要一系列的时间:

SELECT * 
FROM users 
WHERE Created >= '20130228' AND Created < '20130301'

此外,请对日期“YYYYMMDD”使用不含糊的格式,而不是其他格式。

因为您没有指定时间,所以它假定您正在执行以下操作:

SELECT * FROM users WHERE Created = '28/02/2013 00:00:00'
如果你想要一整天,那么你需要一系列的时间:

SELECT * 
FROM users 
WHERE Created >= '20130228' AND Created < '20130301'

此外,请使用日期格式“YYYYMMD”而不是其他格式的非歧义格式。

< P>如果您不需要考虑时间:尝试将创建的字段转换为日期,然后比较为;p>
SELECT * FROM users WHERE convert(date,Created) = '28/02/2013'

--this would be even better with iso date format (not culture specific)
SELECT * FROM users WHERE convert(date,Created) = '20130228' --yyyymmdd format

如果您不需要考虑时间:尝试将创建的字段转换为日期,然后比较为;p>

SELECT * FROM users WHERE convert(date,Created) = '28/02/2013'

--this would be even better with iso date format (not culture specific)
SELECT * FROM users WHERE convert(date,Created) = '20130228' --yyyymmdd format

从convertvarchar20,a.time_inserted,101='02/28/2013'的用户中选择*此解决方案的风险在于您正在进行字符串比较,而不是日期比较。因此,您必须小心匹配日期格式。从convertvarchar20、a.time_inserted、101='02/28/2013'的用户中选择*此解决方案的风险在于您正在进行字符串比较,而不是日期比较。所以,您必须小心匹配日期格式。@DavidB否,我的意思是SQL Server的“YYYYMMDD”,因为它在RDBMS上对日期时间和日期数据类型没有歧义。虽然“YYYY-MM-DD”对于日期数据类型也没有歧义。@DavidB:SQL Server对ISO-8601的DATETIME解释实际上只是YYYYMMDD无破折号!。使用破折号(通常ISO-8601标准不适用于所有语言设置)时,它可能会失败,也可能会失败,例如德语、英国英语或几乎任何欧洲语言设置…@DavidB No,我的意思是SQL Server的“YYYYMMDD”,因为它在该RDBMS上对日期时间和日期数据类型没有歧义。虽然“YYYY-MM-DD”对于日期数据类型也没有歧义。@DavidB:SQL Server对ISO-8601的DATETIME解释实际上只是YYYYMMDD无破折号!。使用破折号(通常ISO-8601标准不适用于所有语言设置)时,它可能会失败,也可能会失败,例如德语、英国英语或几乎任何欧洲语言设置……如果时间部分很重要,则不应使用“介于之间”。“20130228 23:59:59”之类的值会发生什么情况?它们会被过滤掉。这只是一个示例,如果需要,您可以指定秒数。如果时间部分很重要,则不应使用间隔。像'20130228 23:59:59'这样的值会发生什么,它们会被过滤掉。这只是一个示例,如果需要,您也可以指定秒数