【问题标题】:Find data with specific date and month only仅查找具有特定日期和月份的数据
【发布时间】:2015-12-11 16:43:05
【问题描述】:

我正在尝试查找具有特定日期和月份 where 子句的数据,但我收到一个错误,谁能帮我解决这个问题?

select *
from my_data
where date BETWEEN '11-20' AND '12-15'

MS SQL Server 管理工作室

我收到一个错误

从字符串转换日期和/或时间时转换失败

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql date sql-server-2012


【解决方案1】:

大多数数据库都支持提取日期分量的函数。因此,一种方法是将值转换为数字并进行如下比较:

where month(date) * 100 + day(date) between 1120 and 1215

提取日期部分的功能因数据库而异,因此您的数据库可能有一些不同的方法来执行此操作。

【讨论】:

  • 试过但没有显示任何数据。我在 ('2015-11-20') AND ('2015-12-15') 之间的年份做到了,但我不希望年份被包括在内。
  • 这不起作用,例如:SELECT MONTH(11-20-2015) -- 返回 6 SELECT DAY(11-20-2015) -- 返回 17 6*100 = 600 + 17 = 617这不会落在 1120 和 1215 之间,这就是为什么你什么都得不到。
  • @user7107 。 . .我不确定为什么这个答案不起作用。年份真的与这里的逻辑无关。
  • @WBratz 。 . . month('2015-11-20') 返回 11,而不是 6。
  • @GordonLinoff 因为您在使用 MONTH() 或 DAY() 时放入 () 中的所有内容都会更改它输出的整数,例如 MONTH('2015-11-20') 输出 11,你重新正确。但是 MONTH(11-20-2015) 或 MONTH(2015-11-20) 输出 6。
【解决方案2】:

转换失败,因为您没有指定年份。如果您要指定“11-20-2015”,您的查询只需插入您需要的任何年份即可。

SELECT *
FROM my_data
WHERE date BETWEEN '11-20-2015' AND '12-15-2015'

或者,如果您想要该日期范围内多年的数据,我会使用 while 循环在 # 表中插入信息,然后从该表中读取,这取决于数据量,这可能是快速或缓慢www这里是例子。

DECLARE @mindatestart date, @mindateend date, @maxdatestart date

SET @mindatestart = '11-20-2010'
SET @mindateend = '12-15-2010'
SET @maxdatestart = '11-20-2015'

SELECT top 0 *, year = ' '
INTO #mydata
FROM my_data

WHILE @mindatestart < @maxdatestart
    BEGIN
        INSERT INTO #mydata
        SELECT *, YEAR(@mindatestart) 
        FROM my_data
        where date between @mindatestart and @mindateend

        SET @mindatestart = DATEADD(Year, 1, @mindatestart)
        SET @mindateend = DATEADD(Year, 1, @mindateend)
    END 

这将循环并插入 2010-2015 年这些日期范围的数据,并在末尾添加一个额外的列,以便您可以调用数据并按年份排序

    SELECT * FROM #mydata order by YEAR

希望这能有所帮助!

来自下面的评论

SELECT *
FROM my_data
WHERE DAY(RIGHT(date, 5)) between DAY(11-20) and DAY(12-15) 

'11-20' 不起作用的原因是因为它是一个字符串,这就是为什么你必须在 ' ' 之间输入它为整数。这就是为什么您没有使用第一个答案中的方法获得任何回报的原因,表日期字段中的“-Year”被添加到数值中,您的值刚刚从 11-20 转换,您可以通过使用这些查询

SELECT MONTH(11-20) --Returns 12
SELECT MONTH(11-20-2015) -- Returns 6
SELECT MONTH(11-20-2014) -- Returns 6

使用 RIGHT(Date, 5) 你只会得到月-日,然后你会确定那个日期的日期,所以 DAY(RIGHT(DATE, 5) 并且你应该得到理论上应该在这些日期范围内的东西,尽管年。但是我不确定数据的准确性如何,而且为了不在您的原始查询中添加额外的 8 个字符需要做很多工作。

【讨论】:

  • 首先,非常感谢。但我只想使用 select 语句。如果可以的话,请帮助我。我也知道我没有指定年份,因为我不想要它。WHERE date BETWEEN '11-20-2015' AND '12-15-2015' 是一个我可以提取年份的示例,但为什么不能没有年份?
  • 如果您只想输入一个月和一天而不是一年,您将无法使用您输入的内容获得您想要的内容,您可以使用 MONTH() 和DAY() 但你不会得到任何回报,因为年份输入改变了这些函数返回的值所以你必须做大量的转换,比如 SELECT * FROM my_data WHERE MONTH(RIGHT(date, 5))在 MONTH(11-20) 和 MONTH(12-15) 之间,我会将其添加到我的原始答案中
【解决方案3】:

由于您只关心月份和日期,而不关心年份,因此您需要使用DATEPART 来拆分日期。试试这个:

select *
from my_data
WHERE 1=1
AND (DATEPART(m, date) >= 11 AND DATEPART(d,date) >= 20) 
AND (DATEPART(m, date) <= 12 AND DATEPART(d,date) <= 15) 

【讨论】:

  • 我没有对此进行测试,但这是思考这个问题的好方法,并且完全逃脱了我的想法,感谢您的想法!
猜你喜欢
  • 2017-08-28
  • 2015-04-18
  • 1970-01-01
  • 2021-12-02
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 2013-02-15
相关资源
最近更新 更多