仅基于月和年的 SQL Server 日期比较

标签 sql sql-server sql-server-2008 date

我无法确定仅基于月和年比较 SQL 中日期的最佳方法。

我们根据日期进行计算,并且由于按月计费,因此每月的日期造成了更多障碍。

例如

DECLARE @date1 DATETIME = CAST('6/15/2014' AS DATETIME),
        @date2 DATETIME = CAST('6/14/2014' AS DATETIME)

SELECT * FROM tableName WHERE @date1 <= @date2

上面的示例不会返回任何行,因为 @date1 大于 @date2。所以我想找到一种方法来摆脱等式。

同样,以下情况也同样让我感到悲伤。
DECLARE @date1 DATETIME = CAST('6/14/2014' AS DATETIME),
        @date2 DATETIME = CAST('6/15/2014' AS DATETIME),
        @date3 DATETIME = CAST('7/1/2014' AS DATETIME)

SELECT * FROM tableName WHERE @date2 BETWEEN @date1 AND @date3

我已经完成了日期的内联转换,以得出指定日期的月份的第一天和最后一天。
SELECT * 
FROM tableName 
WHERE date2 BETWEEN
    DATEADD(month, DATEDIFF(month, 0, date1), 0) -- The first day of the month for date1
    AND
    DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, date2) + 1, 0)) -- The lastday of the month for date3

必须有一种更简单的方法来做到这一点。有什么建议?

最佳答案

为了处理不等式,例如在两者之间,我喜欢将日期/时间转换为 YYYYMM 表示,无论是作为字符串还是整数。对于这个例子:

DECLARE @date1 DATETIME = CAST('6/14/2014' AS DATETIME),
        @date2 DATETIME = CAST('6/15/2014' AS DATETIME),
        @date3 DATETIME = CAST('7/1/2014' AS DATETIME);

SELECT * FROM tableName WHERE @date2 BETWEEN @date1 AND @date3;

我会将查询写为:
SELECT *
FROM tableName
WHERE year(@date2) * 100 + month(@date2) BETWEEN year(@date1) * 100 + month(@date1) AND
                                                 year(@date3) * 100 + month(@date1);

关于仅基于月和年的 SQL Server 日期比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26239784/

相关文章:

php - 行之间的时间差

sql - 大型 SQL 插入 TVF 与 BULK 插入

c# - 使用外部 SQL Server 2008 R2 更新 linq 中的语句

sql - 如何更改架构名称并将表移至另一个架构?

sql join使用递归cte

安全模式下mysql删除

sql - 使用 JOIN 而不是 WHERE 过滤

sql - 将现有表转换为 SQL 图形节点或边缘

sql-server-2008 - 为什么在存储过程调用的参数之一上使用 CONVERT 会出错?

表中任何 id 之间的 SQL 超时和超时冲突