SQL Server中的LEFT函数不返回任何结果

时间:2019-02-21 20:31:16

标签: sql sql-server date datetime

我试图将与某个月份相对应的数据从SQL数据库放入临时表中。

DROP TABLE
    #ComPAIR_Alliance_Table
SELECT
    IMOno
    ,period
    ,[service]
    ,alliances
INTO
    #ComPAIR_Alliance_Table
FROM
    com_COMPAIR.dbo.Data_BlueWaterCapacity_US_2
WHERE
    LEFT(period, 7) = '2015-03'

SELECT
     *
FROM #ComPAIR_Alliance_Table

期间字段采用以下格式:2015-03-29 00:00:00.000

但是,我的代码只返回了一个空的临时表,其中包含正确的列名,但没有行(即使我确定表中存在具有该日期的行)。我已经通过使用is.numeric来确保period列确实是一个字符串。

有人可以帮我解决可能出现的问题吗?

谢谢!

5 个答案:

答案 0 :(得分:3)

如果它是日期/日期时间/日期时间2,则可以将其与2015-03进行比较,例如:

WHERE period >= '2015-03-01'
AND   preiod <  DATEADD(MONTH, 1, '2015-03-01')

以防万一:

  • 以上内容将与2015年3月的所有日期匹配,例如2015-03-312015-03-31 23:59:592015-03-31 23:59:59.9999999
  • 以上内容可理解:DATEADD部分不依赖于表行

答案 1 :(得分:2)

猜测Perioddate。如果是这样,请停止将其视为varchar,不是一个。如果您想要2015年3月以后的值,请执行以下操作:

WHERE period >= '20150301'
  AND period < '20150401'

答案 2 :(得分:0)

LEFT做一些奇怪的事情,因为 LEFT导致从Date隐式转换为String 。您可以查看this question以获得更多信息,但是您所得到的正是SQL所要获得的-在行上的联接,其中句点的左7个字符等于'2015-03',这不会发生,因为喜欢与“ Jan 01”之类的东西进行比较

答案 3 :(得分:0)

LEFT函数需要将您的datetime列隐式转换为varchar值才能正常工作。 SQL Server根据其国际化设置选择日期的varchar格式。在我的服务器上,其Mar 29 2015 12:00AMLEFT产生Mar 29。这就是为什么它不等于2015-03的原因。

您应该将列视为日期时间,然后使用有效的日期时间比较执行比较,如下所示:

WHERE period BETWEEN '1/1/2015' AND '1/31/2015'

答案 4 :(得分:-2)

日期存储为日期类型。您可能要尝试

where convert(varchar(20), period,121) 

会将其转换为字符串...