SQL Server查询无法正确显示筛选结果

时间:2017-03-09 08:08:52

标签: sql-server tsql

我有类似的SQL服务器查询:

SELECT * FROM mytable 
WHERE company_name = 'Shell'
  and datetime >= '2017-03-06' 
  and datetime <= '2017-03-06' 
ORDER BY datetime DESC

现在代码显示所有Shell行甚至在搜索日期之外。

我只想在2017-03-06中使用Shell行。

我的错误在哪里?

此代码通常在MySQL服务器中运行良好。

5 个答案:

答案 0 :(得分:1)

CAST(datetime AS DATE)并仅与日期进行比较

SELECT * FROM mytable WHERE company_name = 'Shell' and CAST(datetime  AS DATE)= '2017-03-06' ORDER BY datetime DESC

答案 1 :(得分:1)

我认为这是由您的日期服务器设置引起的(它不是使用03作为月份,而是作为日期)。 始终使用

CONVERT使用日期时(插入,在哪里等)。例如。 CONVERT(datetime,'2017-03-06',121)如果日期格式为'yyyy-mm-dd'。

CREATE TABLE mytable (ID INT, COMPANY_NAME VARCHAR(10), DATETIME DATETIME)
SELECT * FROM mytable

INSERT INTO mytable VALUES (1,'Shell', '2017-03-06')
INSERT INTO mytable VALUES (2,'Shell', '2017-03-07')
INSERT INTO mytable VALUES (3,'Shell', '2017-03-05')
INSERT INTO mytable VALUES (4,'Shell', '2017-03-06')


INSERT INTO mytable VALUES (5,'Nut', CONVERT(datetime, '2017-03-06',121))
INSERT INTO mytable VALUES (6,'Nut', CONVERT(datetime, '2017-03-07',121))
INSERT INTO mytable VALUES (7,'Nut', CONVERT(datetime, '2017-03-05',121))
INSERT INTO mytable VALUES (8,'Nut', CONVERT(datetime, '2017-03-06',121))


---Results can be uncorrect
SELECT ID, COMPANY_NAME, DATETIME, CONVERT(varchar,DATETIME,121) AS DATE_STR
FROM mytable
WHERE company_name = 'Shell'
    AND DATETIME >= '2017-03-06'
    AND DATETIME <= '2017-03-06'
ORDER BY DATETIME DESC

---Results correct
SELECT ID, COMPANY_NAME, DATETIME, CONVERT(varchar,DATETIME,121) AS DATE_STR
FROM mytable
WHERE company_name = 'Nut'
    AND DATETIME >= CONVERT(datetime, '2017-03-06',121)
    AND DATETIME <= CONVERT(datetime, '2017-03-06',121)
ORDER BY DATETIME DESC

答案 2 :(得分:0)

SELECT * FROM mytable WHERE company_name = 'Shell' and datetime like '2017-03-06%' ORDER BY datetime DESC

答案 3 :(得分:0)

你可以这样做:

SELECT * 
FROM mytable 
WHERE company_name = 'Shell' 
  and datetime >= '2017-03-06' 
  and datetime < '2017-03-07' 
ORDER BY datetime DESC

它将获取 datetime 在“2017-03-06”的任何位置的所有行。

或者将 datetime 转换为 date 数据类型为 Anil Kumar 建议,然后使用datetime = '2017-03-06'子句。

答案 4 :(得分:0)

关于sql server最重要的事情。 “总是考虑两次你写的标准”其他答案可以解决你的问题,但主要的问题是你的算法或编码sql的逻辑。你需要什么?这个问题的答案是“特定日期”,因此请指明日期。不要使用&lt;&gt;。我看到你将这些逻辑用于日期时间格式。所以转换为日期然后比较。如果你不需要小时,分钟或其他东西浪费它们。这种逻辑总是使你的问题变得简单。最好的问候。