|
我在确定仅基于月份和年份的SQL中比较日期的最佳方法时遇到了麻烦。' A7 c/ Z& |3 n6 L' }6 Y, K
我们会根据日期进行计算,由于结算是按月进行的,所以该月的日期造成了更大的障碍。1 v* N$ O& b' ~- W3 K5 H5 Z
例如
* b( R2 R- f a1 X sDECLARE @date1 DATETIME = CAST('6/15/2014' AS DATETIME),
, ^- m) l& Z$ E8 ~+ g @date2 DATETIME = CAST('6/14/2014' AS DATETIME)6 v2 D8 s Z5 i
SELECT * FROM tableName WHERE @date1 上面的示例将不返回任何行,因为@ date1大于@ date2。因此,我想找到一种摆脱困境的方法。: x1 S8 n6 Q" |" q% o
同样,以下情况由于相同的原因也让我感到悲伤。
" V, g" R1 \0 ^: i `: ^2 TDECLARE @date1 DATETIME = CAST('6/14/2014' AS DATETIME),
3 F! q" o' q/ _: U1 A6 e. [- k, ^ @date2 DATETIME = CAST('6/15/2014' AS DATETIME),
1 j8 b5 v4 x4 B @date3 DATETIME = CAST('7/1/2014' AS DATETIME)
& v5 Z( o9 l% bSELECT * FROM tableName WHERE @date2 BETWEEN @date1 AND @date3
) w7 a, z+ @" V2 I& r我已经完成日期的内联转换,以得出指定日期的月份的第一天和最后一天。: O1 H o4 [5 B1 C+ k9 o' M' \
SELECT * 0 }- o$ n+ J0 c* a$ O' A2 [9 w
FROM tableName
# s- S7 d+ H7 u% O, i' ~WHERE date2 BETWEEN
% o, H! r% I( v. }; D2 n+ X2 l DATEADD(month, DATEDIFF(month, 0, date1), 0) -- The first day of the month for date1
1 W. S% U3 F) w; X L; G% Q AND& ^- m* H; d. m _& D- b
DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, date2) + 1, 0)) -- The lastday of the month for date3
* E4 W% i4 ]) t8 l8 b6 I' h必须有一种更简单的方法来执行此操作。有什么建议?
1 ^5 Y, F4 {+ `; I5 H
( {; e- [8 M( n$ t: C2 [; @5 D解决方案:7 }: d0 d2 h% Z9 o
1 i% Z+ [4 d* G; N
, K# H4 n2 M0 `% q4 E9 K0 A$ K8 q1 y0 G& p) @+ w
为了处理不等式,例如,我喜欢将日期/时间转换为YYYYMM表示形式(字符串或整数)。对于此示例:- M% e X2 m+ W3 C6 [& Y6 H
DECLARE @date1 DATETIME = CAST('6/14/2014' AS DATETIME),
# ?* a* H6 h1 h @date2 DATETIME = CAST('6/15/2014' AS DATETIME),
$ W4 l3 s: s* w @date3 DATETIME = CAST('7/1/2014' AS DATETIME);" H: }1 _ c2 ]
SELECT * FROM tableName WHERE @date2 BETWEEN @date1 AND @date3;
5 p4 M J- ~* M' w我将查询写为:
$ e1 _' [! |0 X: T& Z) A: P PSELECT *
: A2 c* H" R8 m. t6 IFROM tableName1 v+ v4 g# u* f/ D
WHERE year(@date2) * 100 + month(@date2) BETWEEN year(@date1) * 100 + month(@date1) AND
: |/ m$ R- `4 }1 j" F2 G2 z/ T) p* ^ year(@date3) * 100 + month(@date1); |
|