我正在使用SQL Server Mgmt Studio。我需要创建一个公式,只有在日期/时间字段LAW_TAEEMASTER.MASTR_ENTRY的月份和日期小于或等于当前月份和日期时才会选择记录。例如,如果LAW_TAEEMASTER.MASTR_ENTRY = 8/20/2015且当前日期= 7/6/2017,则排除。如果LAW_TAEEMASTER.MASTR_ENTRY = 12/21/2014,当前日期= 1/15/2017,请加入。日期格式化是我的弱点。这是我尝试过的:
select LAW_TAEEMASTER.MASTR_ENTRY
from LAW_TAEEMASTER
WHERE day(LAW_TAEEMASTER.MASTR_ENTRY) <= DAY(GETDATE()) and MONTH(LAW_TAEEMASTER.MASTR_ENTRY) <= MONTH(getdate())
和
select LAW_TAEEMASTER.MASTR_ENTRY
from LAW_TAEEMASTER
WHERE AND DATEPART(DAY,LAW_TAEEMASTER.MASTR_ENTRY) <= DATEPART(DAY,GETDATE()) AND DATEPART(MONTH,LAW_TAEEMASTER.MASTR_ENTRY) <= DATEPART(MONTH,GETDATE())
但这些只是分别评估月份和日期以及大于或小于的数字,因此它不包括记录。我怎样才能让SQL将这些识别为日期的一部分而忽略这一年?
答案 0 :(得分:0)
解释逻辑和代码:
使用CONVERT(varchar(5),<your_date> ,110))
。 110
争论意味着美国标准时间,并且具有mm-dd-yyyy
之类的输出。然后我们只取前五个字符,即日期的月份和日期。
110 = mm-dd-yyyy 详细了解cast and convert here
我的样本表:
MASTER_ENTRY
2017-08-30
2017-07-05
2017-07-04
然后我执行了此查询
SELECT LAW_TAEEMASTER.MASTR_ENTRY
FROM LAW_TAEEMASTER
WHERE CONVERT(varchar(5),LAW_TAEEMASTER.MASTR_ENTRY ,110) <= CONVERT(varchar(5),GETDATE() ,110)
结果:月份和日期等于或等于当前月份和日期
MASTER_ENTRY
2017-07-05
2017-07-04
我希望这对StackOverflow有所帮助和欢迎。如果您发现此答案或任何其他答案可以解决您的问题,请将其标记为解决方案。这将有助于社区和未来遇到同样问题的程序员。感谢。
答案 1 :(得分:0)
我会使用month()
和day()
:
where month(LAW_TAEEMASTER.MASTR_ENTRY) * 100 + day(LAW_TAEEMASTER.MASTR_ENTRY) < month(getdate()) * 100 + day(getdate())
如果性能有问题,我建议使用带索引的计算列。
答案 2 :(得分:-1)
诀窍是通常以类似CCYYMMDD格式的方式将数据存储在表中。然后,您可以使用普通比较运算符比较日期。所以2017年7月5日将是20170705.你经常得到ISO Date formats 还有其他格式,就像1st Jan 1970之类的毫秒数一样。 如果时区也发挥作用,事情会变得更加复杂(UTC)。 如果您使用简单的CCYYMMDD格式,只需将10000除以并使用余数进行比较就可以进行MMDD比较。