【问题标题】:MS SQL compare dates?MS SQL 比较日期?
【发布时间】:2011-06-15 04:59:11
【问题描述】:

我有 2 个日期(日期时间):

date1 = 2010-12-31 15:13:48.593
date2 = 2010-12-31 00:00:00.000

同一天,只是时间不同。由于 date1 时间,使用

谢谢:)

【问题讨论】:

  • 什么版本的 SQL Server?您在什么情况下进行此比较(如果您要与列进行比较,则需要注意保持可搜索性)?
  • 我在“选择案例”中这样做。如果日期
  • 如果比较失败,您的日期似乎存储为字符串。如果它们被存储为日期时间,我猜是比较
  • date1

标签: sql-server tsql sql-server-2008 date


【解决方案1】:
SELECT CASE WHEN CAST(date1 AS DATE) <= CAST(date2 AS DATE) ...

应该做你需要的。

测试用例

WITH dates(date1, date2, date3, date4)
     AS (SELECT CAST('20101231 15:13:48.593' AS DATETIME),
                CAST('20101231 00:00:00.000' AS DATETIME),
                CAST('20101231 15:13:48.593' AS DATETIME),
                CAST('20101231 00:00:00.000' AS DATETIME))
SELECT CASE
         WHEN CAST(date1 AS DATE) <= CAST(date2 AS DATE) THEN 'Y'
         ELSE 'N'
       END AS COMPARISON_WITH_CAST,
       CASE
         WHEN date3 <= date4 THEN 'Y'
         ELSE 'N'
       END AS COMPARISON_WITHOUT_CAST
FROM   dates 

返回

COMPARISON_WITH_CAST   |  COMPARISON_WITHOUT_CAST
Y                         N

【讨论】:

  • 请注意,DATE 类型在 SQL Server 2008 之前不可用。
  • @Luke - 是的。因此,我询问了 OP 的版本。
  • @grady - 是的!查看测试用例,这完全符合您的要求!
【解决方案2】:

使用DATEDIFF 函数,日期部分为day

SELECT ...
FROM ...
WHERE DATEDIFF(day, date1, date2) >= 0

请注意,如果您想测试 date1 date2,那么您需要测试 DATEDIFF(day, date1, date2) &gt;= 0,或者您可以测试 DATEDIFF(day, date2, date1) &lt;= 0

【讨论】:

  • 这行得通,但你能解释一下为什么吗?不就是比较天数吗?
  • @grady:不,它计算date1date2 之间的边界 天数;也就是说,您从date1date2 要经过的午夜数
  • +1 这里最优雅的解决方案。我会考虑 ABS 或 0 虽然如果需要允许 date2 在 date1 之前
【解决方案3】:

简单的一行解决方案是

datediff(dd,'2010-12-31 15:13:48.593','2010-12-31 00:00:00.000')=0

datediff(dd,'2010-12-31 15:13:48.593','2010-12-31 00:00:00.000')<=1

datediff(dd,'2010-12-31 15:13:48.593','2010-12-31 00:00:00.000')>=1

除了“dd”之外,你可以尝试各种选项

【讨论】:

    【解决方案4】:

    试试这个:

    BEGIN
    
    declare @Date1 datetime
    declare @Date2 datetime
    
    declare @chkYear int
    declare @chkMonth int
    declare @chkDay int
    declare @chkHour int
    declare @chkMinute int
    declare @chkSecond int
    declare @chkMiliSecond int
    
    set @Date1='2010-12-31 15:13:48.593'
    set @Date2='2010-12-31 00:00:00.000'
    
    set @chkYear=datediff(yyyy,@Date1,@Date2)
    set @chkMonth=datediff(mm,@Date1,@Date2)
    set @chkDay=datediff(dd,@Date1,@Date2)
    set @chkHour=datediff(hh,@Date1,@Date2)
    set @chkMinute=datediff(mi,@Date1,@Date2)
    set @chkSecond=datediff(ss,@Date1,@Date2)
    set @chkMiliSecond=datediff(ms,@Date1,@Date2)
    
    if @chkYear=0 AND @chkMonth=0 AND @chkDay=0 AND @chkHour=0 AND @chkMinute=0 AND @chkSecond=0 AND @chkMiliSecond=0
        Begin
            Print 'Both Date is Same'
        end
    else
        Begin
            Print 'Both Date is not Same'
        end
    End
    

    【讨论】:

      【解决方案5】:

      我总是使用 DateDiff(day,date1,date2) 来比较两个日期。

      查看以下示例。只需复制它并在 Ms sql server 中运行。 另外,请尝试将日期从 12 月 31 日更改为 12 月 30 日并检查结果

      BEGIN
      
      declare @firstDate datetime
      declare @secondDate datetime
      
      
      declare @chkDay int
      
      set @firstDate ='2010-12-31 15:13:48.593'
      set @secondDate ='2010-12-31 00:00:00.000'
      
      set @chkDay=Datediff(day,@firstDate ,@secondDate )
      
      if @chkDay=0
          Begin
              Print 'Date is Same'
          end
      else
          Begin
              Print 'Date is not Same'
          end
      End
      

      【讨论】:

        【解决方案6】:

        永远不会太晚 我在我的 SQL 中使用下面的脚本,它对我来说工作正常

        SELECT
            ID ,
            CASE
                WHEN DATEDIFF(day, ExpectedDate, ActualDate) < 0
                THEN 'Late'
                ELSE 'OnTime'
            END shipmentStatus
        FROM orders
        ORDER BY ExpectedDate
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-22
          • 2021-12-23
          相关资源
          最近更新 更多