【问题标题】:How to use Where clause with datetime in SQL Server 2008如何在 SQL Server 2008 中使用带日期时间的 Where 子句
【发布时间】:2013-05-06 06:38:49
【问题描述】:

我已经写了这个查询:

SELECT * 
FROM w_tbl 
WHERE DID NOT IN (SELECT DId FROM tbl_Assign) 
  AND CAST(MeasDateTime AS Date) = @dta 
ORDER BY 
    CAST(MeasDateTime as DATE) DESC

如您所见,我正在发送一个参数化查询。

所以我把24/09/2010 00:00:00 换成@dta

但我得到这个错误:

从租船人字符串转换日期和/或时间时转换失败。

我告诉你我为什么这样做以及我的目的:

我有一个日期时间列,我只想按日期选择/获取所有数据(即我不想明智地获取日期时间,它必须只是根据日期)

【问题讨论】:

  • 您的意思是将@dta 的值设置为字符串?为什么不将其设置为 DateTime
  • 我怀疑 MeasDateTime 可能没有有效值。顺便问一下这个专栏的类型是什么?
  • @JonSkeet 我在数据库中的字段也是日期时间,它不是字符串......
  • @RafalZiolkowski 我的列类型是 datetime only
  • 嗨 jitendar,你能先检查一下@dta 值吗,因为 24/09/2010 可能是错误的日期。尝试使用 09/24/2010 并检查它是否有效。

标签: .net sql visual-studio-2010 sql-server-2008 datetime


【解决方案1】:

如果您只想按日期选择并且您有 DateTime 类型,请使用日期函数:

DATEADD ( dd , 0 , DATEDIFF ( dd , 0 , @dta))

所以在你的情况下:

SELECT * 
FROM w_tbl 
WHERE DID NOT IN (SELECT DId FROM tbl_Assign) 
  AND DATEADD ( dd , 0 , DATEDIFF ( dd , 0 , MeasDateTime)) = DATEADD ( dd , 0 , DATEDIFF ( dd , 0 , @dta)) 
ORDER BY 
    MeasDateTime DESC -- No need for CAST/CONVERT here, it will be ok either way

【讨论】:

    【解决方案2】:

    首先检查@dta 值,因为 24/09/2010 可能是错误的日期。尝试使用 09/24/2010 或 24-Sep-2010 并检查。始终avoid confusion in dd/MM/yyyy and MM/dd/yyyy 使用 MMM 一个月。 SQL 使用 MMM 正确处理日期时间格式。就像 dd-MMM-yyyy。默认情况下,SQL 使用美国标准,取日期格式为 MM/dd/yyyy。

    谢谢。

    【讨论】:

    • SQL Server 一致解释的唯一格式是YYYYMMDD;这是documented,由于语言环境设置,使用其他格式的日期文字迟早会中断。
    • @Pondlife。感谢您更新文档。但是对于上述问题,Jitendra 对 dd/MM/yyyy 和 MM/dd/yyyy 日期格式感到困惑,这是他的实际问题,我想在使用语言环境格式进行转换或转换时突出 Jitendra 和其他人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2023-03-21
    • 2013-12-06
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多