【问题标题】:SQL query not pulling correct yearSQL 查询没有提取正确的年份
【发布时间】:2016-04-25 11:26:50
【问题描述】:

我有一个问题

SELECT
    convert(varchar, dates, 101) 
FROM 
    database 
WHERE 
    dates BETWEEN '04/01/2015' AND '04/30/2015'

它返回所有四月的日期,但问题是它是每年的(即 2010、2011、2012、2013、2014、2015)。我认为它不是读取今年的最后两位数字,而是从 2000 年开始提取所有内容。我这样想对吗?我该如何解决这个问题?

【问题讨论】:

  • 您确定日期字段是日期时间数据类型吗?
  • 如果dates 列被定义为“VARCHAR”或类似的,而不是日期时间,就会发生这种情况。查看表定义可能会有所帮助。
  • 将日期存储为日期,而不是字符串。

标签: sql sql-server


【解决方案1】:

您的日期列可能未定义为日期类型。您可以更新列类型...或在查询中显式转换它:

Select convert(varchar, dates, 101) 
FROM database 
Where convert(date,dates) BETWEEN '04/01/2015' and '04/30/2015'

如果您的日期字段被解释为文本字符串,它会为您提供所有四月日期的原因是因为所有四月日期都将按字母顺序排列在一起。如果它正确地将您的字段解释为日期,它将能够正确过滤它们。

【讨论】:

  • 是的,按字母顺序,04/01/2015 早于 04/02/2010 甚至 04/02/1955
  • 它增加了大约 10 秒的执行时间,但它就像一个魅力!谢谢@BrianPressler
  • 您可能应该将该字段转换为日期类型。然后,您可以对其进行索引,SQL Server 将能够正确使用该索引。
  • 如果我选择转换(日期,日期),那么它会将处理速度提高到 1 秒 :)
【解决方案2】:

您需要以 SQL Server 能够正确理解的标准格式提供日期。见Correct way of specifying a given date in T-SQL

对你来说是:

Where dates BETWEEN '20150401' and '20150430'

【讨论】:

  • 返回 0 行
  • 日期是日期还是日期时间类型的字段?
【解决方案3】:

在 tSQL 中,这对你有用:

SELECT DATEPART(year, dates)
FROM [database]
WHERE DATEPART(MONTH, dates) = 4 AND DATEPART(year, dates)=2015;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    相关资源
    最近更新 更多