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

SQL Server中的LEFT函数不返回任何结果,sql,sql-server,date,datetime,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'

我试图将对应于某个月的数据从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确保句点列确实是一个字符串

有人能帮我解决问题吗


谢谢

日期存储为日期类型。你可能想试试

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

将其转换为字符串…

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

WHERE period >= '2015-03-01'
AND   preiod <  DATEADD(MONTH, 1, '2015-03-01')
其中期间>='2015-03-01'
和前一个月<日期添加(2015-03-01年第1个月)
如有混淆:

  • 上述日期将与2015年3月的所有日期相匹配,例如
    2015-03-31
    2015-03-31 23:59:59
    2015-03-31 23:59:59.999999
  • 上面是可搜索的:
    DATEADD
    部分不依赖于表行

猜测
期间
是一个
日期
。如果是,不要把它当作
varchar
,它不是。如果您想要2015年3月的值,请执行以下操作:

WHERE period >= '20150301'
  AND period < '20150401'
WHERE period>='20150301'
和期间<'20150401'

LEFT正在做一些奇怪的事情,因为LEFT导致从日期开始对字符串进行隐式转换。您可以查看更多信息,但您得到的正是您告诉SQL要获得的内容—一个行上的连接,其中周期的左7个字符等于“2015-03”,这是不会发生的,由于您喜欢与“Jan 01”之类的内容进行比较,
LEFT
函数需要隐式地将您的
datetime
列转换为
varchar
值来完成它的工作。SQL Server正在根据其国际化设置选择日期的
varchar
格式。在我的服务器上,它的
2015年3月29日12:00AM
,和
LEFT
产生
3月29日
。这就是为什么它不等于
2015-03

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


在“2015年1月1日”和“2015年1月31日”之间的期间是什么

期间的数据类型是什么?我打赌它是一个
日期
。句点是一个字符串列吗?还是日期/时间列?请注意,您的查询是不可搜索的。我还尝试使用年份(期间)=2019和月份(期间)=09,但这在您不使用的情况下都不起作用;t使用ISNUMERIC检查数据类型。查看表结构或类似的
选择sql\u variant\u属性(句点,'basetype')
并防止使用索引?这是一个非常糟糕的主意。为什么这会被否决?这与Salman.A的解决方案相同,它们都是同时发布的。有人能解释一下吗?现在有两张反对票?我很想知道原因。如果有人需要在此处添加内容,请分享。:)虽然您的答案可以得到正确的结果,但它仍然依赖于语言环境,并依赖于语言设置。这种格式是一种更安全的选择: