0

我在 ms sql 中有一个巨大的数据库。我有一个日期存储在一个类型的字段中:VARCHAR2 我有代码,但它无法比较日期。我的意思是说?有一个带有发布日期的输入。我需要的是获取启动日期输入,其中启动日期大于日期且小于另一个日期。问题是当我将年份从 2012 年更改为 2013 年时,没有结果。此外,当我的日期为 0(如 01.01.2012)时,它无法编译它们。

到目前为止,我所拥有的是:

edited

有人可以帮我得到正确的结果吗?

编辑1

日期以这种格式存储为字符串:yyyy-mm-dd

4

4 回答 4

1
select
p1.PA_VALUE as Quote_number,
p2.PA_VALUE as Project_Name,
p3.PA_VALUE as requestNumber,
p4.PA_VALUE as reqLocation_CHECK,
p5.PA_VALUE as reqActivityCode,
p6.PA_VALUE as reqSegment,
p7.PA_VALUE as reqTotalPRLocalMargin_CHECK,
p8.PA_VALUE as reqDiscountPerc_CHECK,
p10.PA_VALUE as RequisitionerName,
p11.PA_VALUE as Date_Start,
p13.PA_VALUE as reqTotalPRNetNet_CHECK,
p14.PA_VALUE as reqCustomerNumber,
p15.PA_VALUE as Is_Validated


from WP_WorkflowProcess p 
LEFT JOIN PA_PARAMETER p1 on p1.PA_WP_ID=p.WP_ID AND p1.PA_NAME = 'reqQuoteNumber'
LEFT JOIN PA_PARAMETER p2 on p2.PA_WP_ID=p.WP_ID AND p2.PA_NAME = 'reqProjectName'
LEFT JOIN PA_PARAMETER p3 on p3.PA_WP_ID=p.WP_ID AND p3.PA_NAME = 'RequestNumber'
LEFT JOIN PA_PARAMETER p4 on p4.PA_WP_ID=p.WP_ID AND p4.PA_NAME = 'reqCustomerLocation'
LEFT JOIN PA_PARAMETER p5 on p5.PA_WP_ID=p.WP_ID AND p5.PA_NAME = 'reqActivityCode'
LEFT JOIN PA_PARAMETER p6 on p6.PA_WP_ID=p.WP_ID AND p6.PA_NAME = 'reqSegment'
LEFT JOIN PA_PARAMETER p7 on p7.PA_WP_ID=p.WP_ID AND p7.PA_NAME = 'reqTotalPRLocalMargin'
LEFT JOIN PA_PARAMETER p8 on p8.PA_WP_ID=p.WP_ID AND p8.PA_NAME = 'reqDiscountPerc'
LEFT JOIN PA_PARAMETER p10 on p10.PA_WP_ID=p.WP_ID AND p10.PA_NAME = 'RequisitionerName'
LEFT JOIN PA_PARAMETER p11 on p11.PA_WP_ID=p.WP_ID AND p11.PA_NAME = 'LaunchDate'
LEFT JOIN PA_PARAMETER p13 on p13.PA_WP_ID=p.WP_ID AND p13.PA_NAME = 'reqTotalPRNetNet'
LEFT JOIN PA_PARAMETER p14 on p14.PA_WP_ID=p.WP_ID AND p14.PA_NAME = 'reqCustomerNumber'
LEFT JOIN PA_PARAMETER p15 on p15.PA_WP_ID=p.WP_ID AND p15.PA_NAME = 'isValidated'


WHERE p.WP_TYPE = 'EnergyMarketing' 
AND CONVERT(DATETIME, p11.pa_value) >=  CONVERT(DATETIME, '01.01.2012')
AND CONVERT(DATETIME, p11.pa_value) <=  CONVERT(DATETIME, '01.09.2012')
于 2012-11-01T12:13:26.050 回答
1

在您的WHERE子句中,您不必要地进行双重转换,实际上比较VARCHAR DATETIME

比较DATETIME以下就足够了。

CONVERT(DATETIME, p11.pa_value,104) >= CONVERT(DATETIME, '01.01.2012',104)

或者你可以CAST

CAST(p11.pa_value AS DATETIME) >= CAST('01.01.2012' AS DATETIME)

编辑:我认为您还需要NULL检查[t].PA_NAME

ISNULL([t].PA_NAME,'') = 'yourString'  --if you need filter null PA_NAME
ISNULL([t].PA_NAME,'yourString') = 'yourString' --if you need to bring null PA_NAME
于 2012-11-01T12:15:50.523 回答
1

尝试

WHERE CONVERT(DATETIME, p11.pa_value, 104) >= CONVERT(datetime, '01.01.2012', 104)
于 2012-11-01T12:16:22.173 回答
1

除了有关多种数据类型转换的其他答案之外,请注意您在文字字符串中显示的日期格式。在我的 SQL 服务器(英国地区)上,日期01.09.2012被转换为2012-01-09(1 月 9 日)。

您的查询可能不会返回任何数据,因为您只需要 9 天的数据,而不是 9 个月的数据。

查看我对有关要使用的日期格式的 sql 日期问题问题的回答下的评论。

于 2012-11-01T12:30:42.420 回答