【问题标题】:Query returns wrong row [closed]查询返回错误的行[关闭]
【发布时间】:2020-07-25 12:56:22
【问题描述】:

我有一个这样的查询:

SELECT 
    [tblticket].[TicketID], 
    [Tblcustomers].[CustomerAccNo], 
    [tblticket].[TicketDate], [tblticket].[Collectdate], 
    [tblticket].[TicketTotal], [tblticket].[UserAccNo], 
    [Tblcustomers].[FirstName], [Tblcustomers].[Surname] 
FROM
    TbLTicket 
INNER JOIN 
    Tblcustomers ON TblTicket.[CustomerAccNo] = Tblcustomers.[CustomerAccNo] 
WHERE 
    TicketDate  BETWEEN '13/07/2020' and '24/07/2020'

当我在查询中看到的以下日期之间运行此查询时,我得到的结果包含 2019 年 9 月 13 日的票日期,请问我做错了什么。

请问为什么包含 13/09/2019 行?

【问题讨论】:

  • 我认为您需要先转换/转换您的日期范围值。
  • 您的 TicketDate 列是 varchar。

标签: sql-server string date where-clause


【解决方案1】:

为什么要包括 13/09/2019 行?

您在进行日期比较时正在进行字符串比较。

如果TicketDate 是类似日期的数据类型(应该如此),则考虑对文字使用明确的日期格式:

TicketDate between '20200713' and '20200724'

否则,您需要先cast。 SQL Server 非常擅长解释日期格式,所以这可能就足够了:

cast(TicketDate as date) between '20200713' and '20200724'

最后的手段是使用datefromparts() 重建日期。假设字符串格式DD/MM/YYYY

datefromparts(
    substring(TicketDate, 7, 4),
    substring(TicketDate, 4, 2),
    substring(TicketDate, 1, 2)
) between '20200713' and '20200724'

【讨论】:

  • 请编辑你的答案'substr' is not a recognized built-in function name.你的意思是SUBSTRING()
  • @Ilyes:谢谢。函数的名称因数据库而异,所以我有时会迷路。
猜你喜欢
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多